我正在尝试使用自定义比较器函数对数组进行排序。
比较器功能仅关注两个特定元素之间的顺序。
在下面的示例中,您希望排序后在'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'?有解决方法吗?
答案 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个单位。