当许多相同的元素时,Javascript数组排序不正常

时间:2012-07-19 01:30:15

标签: javascript sorting

我正在尝试使用自定义比较器函数对数组进行排序。

比较器功能仅关注两个特定元素之间的顺序。

在下面的示例中,您希望排序后在'b'之前显示'a',但事实并非如此。

var ar = ["b", "c", "d", "a"];

ar.sort(function(x, y) {
  if (x == 'a' && y == 'b') { return -1; }
  if (x == 'b' && y == 'a') { return 1; }
  return 0; // only the order between 'a' and 'b' matters.
});

console.log(ar);

// ar is still ["b", "c", "d", "a"];

那么为什么'b'之前不是'a'?有解决方法吗?

3 个答案:

答案 0 :(得分:4)

考虑在列表的连续对上调用比较器:

"b", "c" --> 0
"c", "d" --> 0
"d", "a" --> 0

您的比较器表示所有对都相等,因此根本不需要更改顺序。

因为你不关心其他元素出现的顺序(这是对吗?)然后让你的比较器说“a”小于任何东西,“b”比任何东西都大:

ar.sort(function(x, y) {
  if (x == 'a' || y == "b") { return -1; }
  if (x == 'b' || y == 'a') { return 1; }
  return 0; // only the order between 'a' and 'b' matters.
});

答案 1 :(得分:0)

如果'a' = 'c''b' = 'c' - 根据您的功能,那么'a'也等于'b'

答案 2 :(得分:0)

想想像这样的Array.prototype.sort函数......

Array.prototype.sort = function( sortFunc ){
    if( typeof sortFunc !== "function" ){
        sortFunc = function(a,b){
            return a-b;
        }
    }
    var arr = [];
    for(var i = 0, len = arr.length; i <= len; i++ ){
        sortFunc( arr[i], arr[i+1] );
    }
    return arr;
}

正如您所看到的,Array.prototype.sort仅为sortFunc函数提供的元素仅相隔一个单位。

因此,sortFunc(“b”,“a”)不会发生,因为它们的索引不是1个单位。