forked from esamattis/underscore.string
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnaturalCmp.js
More file actions
29 lines (24 loc) · 705 Bytes
/
naturalCmp.js
File metadata and controls
29 lines (24 loc) · 705 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
};