【问题标题】:How to sort numbers correctly with Array.sort()? [duplicate]如何使用 Array.sort() 正确排序数字? [复制]
【发布时间】:2011-10-23 11:19:08
【问题描述】:

在多个浏览器中,以下代码无法正确排序数字:

a = new Array();
a.push(10);
a.push(60);
a.push(20);
a.push(30);
a.push(100);
document.write(a.sort())

它返回10,100,20,30,60

有人知道为什么吗?

【问题讨论】:

  • 只是一个迟到的评论,如果你没有隐式传递一个函数,那么你就是在告诉它对一个 unicodes/strings 数组进行排序。在 unicode 中 100 小于 20。
  • “原因”是Array.sort 排序alphabetically,而不是数字。对于数字排序:a.sort(function(a,b){return a-b}).

标签: javascript arrays sorting numbers numeric


【解决方案1】:
a.sort(function(a,b){return a - b})

这些可能会令人困惑....检查this link

【讨论】:

  • 在 ES6 中它更加优雅:a.sort((a, b) => a - b)
  • 安静优雅。我使用了相同的 ES6Version 并且像魅力一样工作,为什么这不是答案????
  • @Rohith 这个答案是我最近才加入 SO 时写的,老实说,这也不是一个很好的答案。 :P 解决方案很棒,但它没有解释为什么会出现问题,所以我认为 Jason 的回答绝对应该是标记的解决方案。不过,我很高兴您发现我的回答很有用!
【解决方案2】:

Javascript 中数组的默认排序是alphabetical search。如果您想要数字排序,请尝试以下操作:

var a = [ 1, 100, 50, 2, 5];
a.sort(function(a,b) { return a - b; });

【讨论】:

    【解决方案3】:

    您可以使用排序功能:

    var myarray=[25, 8, 7, 41]
    myarray.sort( function(a,b) { return a - b; } );
    // 7 8 25 41
    

    http://www.javascriptkit.com/javatutors/arraysort.shtml

    【讨论】:

    • 这是a - b;这会以相反的顺序返回它。
    • 按照@pimvdb 的建议,请将答案更正为 a-b。
    【解决方案4】:

    我尝试了不同的数字,但它总是表现得好像 0 不存在,否则会正确排序数字。有人知道为什么吗?

    您将获得字典排序(例如,将对象转换为字符串,并按字典顺序对其进行排序),这是 Javascript 中的默认排序行为:

    https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

    array.sort([compareFunction])
    

    参数

    比较函数

    指定定义排序顺序的函数。如果省略,则数组根据每个元素的字符串转换按字典顺序(按字典顺序)排序。

    在 ECMAscript 规范(通用 Javascript 的规范性参考)ECMA-262, 3rd ed.,第 15.4.4.11 节中,默认排序顺序是按字典顺序排列的,尽管他们并没有说出来,而是给出了必要时调用给定比较函数的概念排序函数,否则在转换为字符串时比较参数:

    13. If the argument comparefn is undefined, go to step 16.
    14. Call comparefn with arguments x and y.
    15. Return Result(14).
    16. Call ToString(x).
    17. Call ToString(y).
    18. If Result(16) < Result(17), return −1.
    19. If Result(16) > Result(17), return 1.
    20. Return +0.
    

    【讨论】:

    • @maxhud,如果您想发布一些内容,请添加您自己的答案。
    • 这是在采访中问我的。哈哈,我知道 js 很奇怪!但我喜欢它大声笑
    【解决方案5】:

    试试这个:

    a = new Array();
    a.push(10);
    a.push(60);
    a.push(20);
    a.push(30);
    a.push(100);
    a.sort(Test)
    
    document.write(a);
    
    
    function Test(a,b)
    {
        return a > b ? true : false;
    }
    

    【讨论】:

    • 在这里查看代码:jsfiddle.net/8yxtg/1
    • 首先,a &gt; b ? false : true可以简化为a &lt; b。其次,您实际上需要返回-101,所以这并不完全正确(尽管它可能工作正常)。
    • 排序函数应该返回 -1、0 或 1(不是真/假)。大多数实现实际上会接受 、0 或 ,这就是为什么 return a-b 通常适用于数字。
    • codereturn a - bcode 不能正确管理负数... a
    • @Max uhh...它可以很好地管理负数,试试吧。
    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多