数组排序在JavaScript中无法正常工作

Fre*_*end -2 javascript arrays json

我试过这段代码

function sort() {
    var ary = [2, 1, 0.4, 2, 0.4, 0.2, 1.5, 1, 1.1, 1.3, 1.2, 0.2, 0.4, 0.9];
    alert(ary.sort(function(a, b) {return a < b;}));
}
sort();
Run Code Online (Sandbox Code Playgroud)

但结果是

[1, 2, 2, 1.1, 0.9, 1.2, 1.5, 1, 1.3, 0.4, 0.4, 0.4, 0.2, 0.2]
Run Code Online (Sandbox Code Playgroud)

如果数组的长度很短,它就可以工作.但它不适用于长阵列.谢谢.

Mar*_*ons 12

编辑附加信息:

我很抱歉,但这个问题的最短答案是:

    function sort() {
    var ary = [2, 1, 0.4, 2, 0.4, 0.2, 1.5, 1, 1.1, 1.3, 1.2, 0.2, 0.4, 0.9];
    // use custom compare function that sorts numbers ascending
    alert(ary.sort(function(a, b) {
        return a - b;
    }));
}
sort();
Run Code Online (Sandbox Code Playgroud)

请注意,如果未向 sort 方法提供 compare 函数,则通过将元素转换为字符串并按 Unicode 代码点顺序比较字符串来对元素进行排序,因此[1, 2, 10].sort()产生[1, 10, 2]( "10",作为字符串,在 之前"2")。上面的代码将正确返回从小到大排序的数组。

您可以通过反转 a 和 b 来从大到小排序:

function (a, b) {
    return b - a;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的。默认情况下,数组将作为字符串排序。 (2认同)
  • 请让我知道我错在哪里。但是直接从 [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) 文章中引用 `sort` 方法:“如果 compareFunction 不是提供的元素通过将它们转换为字符串并按 Unicode 代码点顺序比较字符串来排序。” (2认同)

rya*_*uyu 5

您的排序失败,因为您的比较功能不符合以下规范Array.sort:

  • 如果compareFunction(a,b)小于0,则将a排序为低于b的索引,即a先来.
  • 如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对于所有不同的元素进行排序.注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点.
  • 如果compareFunction(a,b)大于0,则将b排序为低于a的索引,即b先出现.
  • 当给定一对特定元素a和b作为其两个参数时,compareFunction(a,b)必须始终返回相同的值.如果返回不一致的结果,则排序顺序未定义.

您的比较函数返回一个布尔值,它实际上只返回值0和1.您应该根据David的答案中的规范修复比较函数.这是一个简单的比较功能1:

var ary = [2, 1, 0.4, 2, 0.4, 0.2, 1.5, 1, 1.1, 1.3, 1.2, 0.2, 0.4, 0.9];
console.log(ary.sort(compareDecimals));

function compareDecimals(a, b) {
    if (a === b) 
         return 0;

    return a < b ? -1 : 1;
}
Run Code Online (Sandbox Code Playgroud)

其他答案(使用function { return a - b; }利用数学巧合.即,相等的值具有0的差异.这适用于"正常"值,但是当您的数据包含诸如Inifinity或的值时,它很容易出错Number.MIN_SAFE_INTEGER.


1.如评论中所述,此函数未解决所有疯狂的javascript编号行为,例如NaN === NaN评估为false.同样,处理混合型数组.根据数据的性质,根据需要设计比较功能.