我怎样才能确保一个稳定的array.sort()命令,javascript

时间:2017-03-24 17:15:42

标签: javascript algorithm sorting

如何在所有浏览器中确保稳定的.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));

但是,texasranger的顺序似乎随机变化。我相信由于它们是相同的数字,但我希望它是一致的。

我如何确保一致性;或者按次要值排序(例如按字母顺序排列thing),以确保我总能得到相同的排序结果?

3 个答案:

答案 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

我分享的帖子给出了代码来做到这一点。