1

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

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

在下面的示例中,您希望在排序后 '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'之前呢?有解决方法吗?

4

3 回答 3

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.
});
于 2012-07-19T01:32:33.593 回答
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 个单位。

于 2012-07-19T01:41:31.577 回答
0

如果'a' = 'c', 和'b' = 'c'- 根据你的功能它是,那么'a'也等于'b'

于 2012-07-19T01:34:21.543 回答