我在列表排序中遇到JavaScript字符串比较问题。 这可能听起来很愚蠢,但我还没有找到任何真正的解决方案。
排序方法没问题如下:
A,B,C D ......
排序类似 A1,A2,A3,A10,A11 的问题 因为它按如下方式排序:
A1,A10,A11,A2,A3
我试图用3种不同的方式来比较我的两个字符串。
1)
return a[key].localeCompare(b[key]);
2)
if ( a[key].toString() < b[key].toString() )
return -1;
if ( a[key].toString() > b[key].toString() )
return 1;
return 0;
3)
a = a[key].toString(), b = b[key].toString();
for (var i=0,n=Math.max(a.length, b.length); i<n && a.charAt(i) === b.charAt(i); ++i);
if (i === n) return 0;
return a.charAt(i) > b.charAt(i) ? -1 : 1;
不幸的是,它保持了错误的排序。 这里有一个例子,其中A1与A10相比与A10相比不同于A10,而它应该是相同的。
答案 0 :(得分:1)
您正在比较字符串,因此它们按字典顺序排序,就好像它们是字典中的单词,而不是将数字视为数字(这似乎是您想要的);要做到这一点,你需要拆分文本&amp;数字部分并将后者转换为实际数字以进行比较。
答案 1 :(得分:0)
斯科特指出,比较基本上发生在二进制值上。要么遵循Scott建议的内容,要么可以在下面的代码片段中尝试这个(只需在代码中添加2行来检查要比较的字符串长度,特定于此方案)
注意:我还没有测试过这段代码。
if(a[key].length < b[key].length) return -1;
if(a[key].length > b[key].length) return 1;
if ( a[key].toString() < b[key].toString() )
return -1;
if ( a[key].toString() > b[key].toString() )
return 1;
return 0;
或者尝试将输入字符串格式化为相同的长度。 例如A02而不是A2