【问题标题】:Why doesn't the sort function of javascript work well?为什么javascript的排序功能不好用?
【发布时间】:2025-12-02 03:25:01
【问题描述】:

这个简单的javascript

var x = new Array();
x[0] = 2.73;
x[1] = 11.17;
x[2] = 3.12
x.sort();

for(var i in x)
    alert(x[i]);

产生结果: 11.17, 2.73, 3.12 而不是 2.73, 3.12, 11.17

为什么会这样,我该如何解决?

提前致谢!

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    它是按字母排序的,尝试传递你自己的排序函数:

    var x = new Array();
    x[0] = 2.73;
    x[1] = 11.17;
    x[2] = 3.12;
    
    numberSort = function (a,b) {
        return a - b;
    };
    
    x.sort(numberSort);
    
    for(var i in x) {
        alert(x[i]);
    }
    

    【讨论】:

    • 请注意,如果您有 inifite 或 NaN 值,此方法将不起作用 - 在这种情况下,您将需要 .filter() 您的 NaN 值,或者使用更复杂的比较器逻辑,如下所示:@ 987654321@
    【解决方案2】:

    默认情况下,Array.sort 将按字母顺序(按字典顺序)排序...但您可以提供自己的函数。试试:

    x.sort(function(a, b) { return a > b ? 1 : -1});
    

    【讨论】:

    • 也可以写成return a-b,因为只有返回值的符号很重要。
    • @Max:听起来是个好主意。这在所有具有Array.sort 的浏览器中是否安全?
    • @sje397:是的,这很安全。它在 ECMAScript 规范中是这样定义的,所有主流浏览器都是这样定义的。
    • @sje397:好吧,我这么说,但实际上它并不完全安全:如果a - b 返回一个大于Number.MAX_VALUE 或小于-Number.MAX_VALUE 的数字,那么它可能会中断。不过有些极端情况。
    • @Tim: details, details :) 可能更安全地坚持使用三元组。无论如何,它们已经濒临灭绝。
    【解决方案3】:

    在它们之间,现有的答案告诉你一切,但没有一个提到你的代码中的两个问题。这是完整的答案:

    排序没有按照您的意愿进行,因为默认排序是词法排序(即数组元素被转换为字符串并按字母顺序进行比较)。您可以提供自己的比较功能给sort()

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

    其次,for...in 实际上并没有告诉您关于数组是否正确排序的任何具体信息,因为未定义 for...in 的枚举(尽管大多数但并非所有浏览器都按照您的预期进行了广泛的操作)。请改用for 循环(实际上您通常应该对数组使用):

    for (var i = 0, len = x.length; i < len; ++i) {
        alert(x[i]);
    }
    

    【讨论】:

    • 你也可以使用带有箭头函数的 es6 语法:x.sort((a, b) =&gt; a - b)
    【解决方案4】:

    Array.sort() 函数将其元素视为字符串,如果没有函数传递给 sort() 语句,它将元素转换为 Unicode 并排序。因此,建议在对数字进行排序时传递自定义排序函数。

    function customSort(a, b){
         return a - b; 
    }
    console.log([-11,-2, 0 ,100].sort(customSort));
    

    此 customSort() 函数将按升序对数组 in_place 进行排序。

    【讨论】:

      【解决方案5】:

      您没有正确迭代。应该是:

      for (var i = 0; i < x.length; i++) {
          alert(x[i]);
      }
      

      当您在 javascript 中使用 for..in 时,这将循环遍历对象的属性,并且迭代顺序未定义。您还应该看到一些奇怪的输出,例如 Array 类中定义的所有函数。

      【讨论】:

      • 那部分绝对是 hinky,人们不应该出于这样的原因将 for...in 用于数组,但输入和输出表明它不会在他的特定浏览器中导致 OP 的特定问题。数组实际上是排序的,只是不像预期的那样。
      最近更新 更多