错误的排序array.Javascript

时间:2016-05-28 19:08:16

标签: javascript arrays sorting

我有以下javascript数组:

a=[0, "b", 2, 3, 4, 5, 1, 9, 8, "A", "a", 11010]

现在我想对它进行排序,我就这样做了

a.sort()

然后我得到以下内容:

[0, 1, 11010, 2, 3, 4, 5, 8, 9, "A", "a", "b"]

我认为这是错误的,因为11010大于2且应该在2之后。 即使我做了以下事情:

a.sort(function(a,b){return a-b;});

我得到以下内容:

[0, "b", 11010, 2, 3, 4, 1, 8, 9, "A", "a", 5]

有人可以解释一下为什么会这样吗?谢谢

3 个答案:

答案 0 :(得分:3)

问题是,在排序时,JavaScript默认将所有数组元素视为字符串。

JavaScript不像Haskell或Java那样是类型安全的。这意味着您可以执行各种疯狂操作,例如添加数字和字符串,或者将字符串与数字进行比较而不会产生错误。

UTF-8 Character Code Table

正如您在此表中所见, 1 的值为49,小于 a

的值97

“1”放在“10110”之前,原因与“a”在“apple”之前排序相同

This video涵盖了由不同类型操作导致的许多非常意外的JavaScript默认模式。

答案 1 :(得分:2)

看一下array.sort如何在link处工作。

如果您不提供自己的排序功能,那么

  

“元素通过将它们转换为字符串并进行比较来排序   Unicode代码点顺序中的字符串。“

作为字符串,11010在2.之前。您没有提供排序功能,因此排序方法使用默认行为。

这就是为什么你会看到你注意到的行为。

答案 2 :(得分:1)

您的数组包含数字和字符串。您需要做的是提供比较功能。

a = [0, "b", 2, 3, 4, 5, 1, 9, 8, "A", "a", 11010]
a.sort(function(c1, c2) {
    if(typeof c1 === "number" && typeof c2 == "number") {
        return c1 - c2;
    } else {    
        return (c1 + "").localeCompare(c2);
    }
 );