JavaScript字符串比较问题

时间:2015-03-24 10:55:47

标签: javascript string sorting compare

我在列表排序中遇到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,而它应该是相同的。

http://jsfiddle.net/TwCwP/52/

2 个答案:

答案 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