You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31 lines
772 B
31 lines
772 B
// adapted from http://nedbatchelder.com/blog/200712.html#e20071211T054956 |
|
|
|
var NUMBER_PATTERN = /([0-9]+)/; |
|
|
|
function naturalCompare(value1, value2) { |
|
var keys1 = ('' + value1).split(NUMBER_PATTERN).map(tryParseInt); |
|
var keys2 = ('' + value2).split(NUMBER_PATTERN).map(tryParseInt); |
|
var key1; |
|
var key2; |
|
var compareFirst = Math.min(keys1.length, keys2.length); |
|
var i, l; |
|
|
|
for (i = 0, l = compareFirst; i < l; i++) { |
|
key1 = keys1[i]; |
|
key2 = keys2[i]; |
|
|
|
if (key1 != key2) { |
|
return key1 > key2 ? 1 : -1; |
|
} |
|
} |
|
|
|
return keys1.length > keys2.length ? 1 : (keys1.length == keys2.length ? 0 : -1); |
|
} |
|
|
|
function tryParseInt(value) { |
|
return ('' + parseInt(value)) == value |
|
? parseInt(value) |
|
: value; |
|
} |
|
|
|
module.exports = naturalCompare;
|
|
|