UNPKG

1.26 kBJavaScriptView Raw
1/**
2 * Returns a number indicating whether a reference string comes before, or after,
3 * or is the same as the given string in natural sort order.
4 *
5 * See: https://en.wikipedia.org/wiki/Natural_sort_order
6 *
7 */
8export default function naturalCompare(aStr, bStr) {
9 var aIdx = 0;
10 var bIdx = 0;
11
12 while (aIdx < aStr.length && bIdx < bStr.length) {
13 var aChar = aStr.charCodeAt(aIdx);
14 var bChar = bStr.charCodeAt(bIdx);
15
16 if (isDigit(aChar) && isDigit(bChar)) {
17 var aNum = 0;
18
19 do {
20 ++aIdx;
21 aNum = aNum * 10 + aChar - DIGIT_0;
22 aChar = aStr.charCodeAt(aIdx);
23 } while (isDigit(aChar) && aNum > 0);
24
25 var bNum = 0;
26
27 do {
28 ++bIdx;
29 bNum = bNum * 10 + bChar - DIGIT_0;
30 bChar = bStr.charCodeAt(bIdx);
31 } while (isDigit(bChar) && bNum > 0);
32
33 if (aNum < bNum) {
34 return -1;
35 }
36
37 if (aNum > bNum) {
38 return 1;
39 }
40 } else {
41 if (aChar < bChar) {
42 return -1;
43 }
44
45 if (aChar > bChar) {
46 return 1;
47 }
48
49 ++aIdx;
50 ++bIdx;
51 }
52 }
53
54 return aStr.length - bStr.length;
55}
56var DIGIT_0 = 48;
57var DIGIT_9 = 57;
58
59function isDigit(code) {
60 return !isNaN(code) && DIGIT_0 <= code && code <= DIGIT_9;
61}