当许多元素相等时,Javascript数组排序无法正常工作
Javascript array sort not working right when many equal elements
我正在尝试使用自定义比较器函数对数组进行排序。
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个单位的间隔。
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 正在尝试使用if和else添加类,但无法正常工作
- Jquery FadeIn FadeOut 只工作一次
- Foreach无法在Typescript中工作
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- JS可以在Chrome中工作,但不能在Firefox中工作
- ajaxToolkit PopupControlExtender不工作.过时的
- HTML标记在脚本标记中工作
- javascript扫雷器floodfill算法不能正常工作