如何在所有浏览器中确保稳定的.sort()订单?的JavaScript
我有一个对象数组,例如
[{
thing: 'walker',
value: 1
},
{
thing: 'texas',
value: 2
},
{
thing: 'ranger',
value: 2
}]
在对数组进行排序时,我使用以下方法将它们与asc / desc交替排序:
_sortNumber (key, dir) {
return function(a, b) {
if (dir) {
// sort descending
return b[key] - a[key];
}
else {
// sort ascending
return a[key] - b[key];
}
}
};
array.sort(this._sortNumber('value', Boolean));
但是,texas
和ranger
的顺序似乎随机变化。我相信由于它们是相同的数字,但我希望它是一致的。
我如何确保一致性;或者按次要值排序(例如按字母顺序排列thing
),以确保我总能得到相同的排序结果?
答案 0 :(得分:3)
既然你正在编写自己的排序函数,你可以定义当值相等时逻辑应该是什么。
_sortNumber (key, dir) {
return function(a, b) {
if (dir) {
// sort descending
if( a[key] !== b[key])
{
return b[key] - a[key];
} else { //They are same.. sort by something else
if (a.thing < b.thing){
return 1;
}else if (a.thing > b.thing){
return -1;
}else{
return 0;
}
}
else {
// sort ascending
if( a[key] !== b[key])
{
return a[key] - b[key];
} else {
if (a.thing < b.thing){
return -1;
}else if (a.thing > b.thing){
return 1;
}else{
return 0;
}
}
}
}
};
答案 1 :(得分:2)
首先,像Array#sort
和其他排序实现一样:
排序不一定是stable。
要保持稳定的排序,您可以使用唯一值,例如索引作为排序条件链中的最后一个排序值,例如
function asc(key) {
return function (a, b) {
return a[key] - b[key] || a.id - b.id;
};
}
array.sort(asc('value'));
答案 2 :(得分:1)
您不仅要按value
排序,还要按thing
请参阅此帖子:How to sort an array of objects by multiple fields?
如果您使用Excel并且您已经设置了排序条件,那么您已经看到它们如何为您提供排序的第一,第二,第三等字段。这就是你需要做的。将第一个字段设置为value
,将第二个字段设置为thing
我分享的帖子给出了代码来做到这一点。