--- /dev/null
+module.exports = function naturalCmp(str1, str2) {
+ if (str1 == str2) return 0;
+ if (!str1) return -1;
+ if (!str2) return 1;
+
+ var cmpRegex = /(\.\d+|\d+|\D+)/g,
+ tokens1 = String(str1).match(cmpRegex),
+ tokens2 = String(str2).match(cmpRegex),
+ count = Math.min(tokens1.length, tokens2.length);
+
+ for (var i = 0; i < count; i++) {
+ var a = tokens1[i],
+ b = tokens2[i];
+
+ if (a !== b) {
+ var num1 = +a;
+ var num2 = +b;
+ if (num1 === num1 && num2 === num2) {
+ return num1 > num2 ? 1 : -1;
+ }
+ return a < b ? -1 : 1;
+ }
+ }
+
+ if (tokens1.length != tokens2.length)
+ return tokens1.length - tokens2.length;
+
+ return str1 < str2 ? -1 : 1;
+};