当许多元素相等时,Javascript数组排序无法正常工作

Javascript array sort not working right when many equal elements

本文关键字:常工作 工作 数组排序 元素 许多 Javascript      更新时间:2023-11-11

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

comparer函数只关心两个特定元素之间的顺序。

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

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

那么,为什么"a"不在"b"之前呢?有变通办法吗?

想想您的比较器在列表的连续对上被调用:

"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.
});

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

把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个单位的间隔。