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

时间:2018-01-03 17:10:23

标签: 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();

但结果是

[1, 2, 2, 1.1, 0.9, 1.2, 1.5, 1, 1.3, 0.4, 0.4, 0.4, 0.2, 0.2]

如果数组长度很短,则有效。但它不适用于长阵列。 感谢。

5 个答案:

答案 0 :(得分:5)

您的排序失败,因为您的比较功能不符合specifications for 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先出现。
  •   
  • compareFunction(a,b)在给定一对特定元素a和b作为其两个参数时必须始终返回相同的值。如果返回不一致的结果,则排序顺序未定义。
  •   

您的比较函数返回一个布尔值,它实际上只返回值0和1.您应该根据David's answer中的规范修复比较函数。这是一个简单的比较函数 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;
}

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

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

答案 1 :(得分:2)

尝试:

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];

function compare(a, b) {
    if (a < b) {
        return -1;
    } else if (a > b) {
        return 1;
    } else {
        return 0;
    }
}


ary = ary.sort(compare);
alert(ary);

答案 2 :(得分:1)

您的密码警告错误。

无论如何,正确的实施是 -

wordViewModel.getWords().observe(this, new Observer<List<Word>>() {
      @Override
      public void onChanged(@Nullable List<Word> words) {
          adapter.setAdapter(words);
          notifyDataSetChanged();
      }
 });

输出 - [0.2,0.2,0.4,0.4,0.4,0.9,1,1,1.1,1.2,1.3,1.5,2,2]

(使用b - a更改排序顺序)。

答案 3 :(得分:1)

使用其他信息进行编辑:

我道歉,但这个问题的最简单答案就是:

    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();

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

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

"2"

答案 4 :(得分:-1)

您也可以使用不带参数的Array.sort()方法。

Doc:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/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());