javascript - 按多个条件排序 - 首先是另一个数组,然后是另一个属性

时间:2016-07-13 10:13:21

标签: javascript arrays sorting

我有一个如下所示的对象数组,并且需要以这样的方式对其进行排序,使得具有c的项首先出现,然后是y,然后是s。对此,例如在c中,它应该按计数器排序,即c-计数器1,c-计数器2。

var data = [ { age:7, counter: 1, code: 'c'},
     { age:5, counter: 2, code: 'c'},
     { age:4, counter: 3, code: 'c'},
     { age:19, counter: 2, code: 'y'},
     { age:22, counter: 1, code: 'y'},
     { age:57, counter: 1, code: 's'},
     { age:80, counter: 2, code: 's'}
    ]

在查看SO时,我能够按照下面的c,y,s进行排序,但是无法对内部的计数器进行另一种排序。我怎么能这样做。

var order =[c,y,s];
data.sort(function(a,b){
        return order.indexOf(a.code) < order.indexOf(b.code) ? -1:1;
})

4 个答案:

答案 0 :(得分:2)

您可以按code的顺序使用对象,然后按计数排序。

var data = [{ age: 7, counter: 1, code: 'c' }, { age: 5, counter: 2, code: 'c' }, { age: 4, counter: 3, code: 'c' }, { age: 19, counter: 2, code: 'y' }, { age: 22, counter: 1, code: 'y' }, { age: 57, counter: 1, code: 's' }, { age: 80, counter: 2, code: 's' }];

data.sort(function (a, b) {
    var order = { c: 1, y: 2, s: 3 };
    return order[a.code] - order[b.code] || a.counter - b.counter;
});

console.log(data);

答案 1 :(得分:1)

您需要将数组指定为

var order =['c', 'y', 's'];

否则c,y和s必须是变量。

此外,如果代码相等,您还需要比较计数器变量

data.sort(function(a,b){
   if ( a.code == b.code )
   {
        return a.counter - b.counter;
   }
   else
   {
       return order.indexOf(a.code) - order.indexOf(b.code);
   }
})

答案 2 :(得分:0)

这是一种按计数器排序的简单方法:

var order = [ 'c', 'y', 's' ];

data.sort(function (a,b) {
    var o;

    if (order.indexOf(a.code) === order.indexOf(b.code))
    {
        o = a.counter - b.counter;
    } else {
        o = order.indexOf(a.code) - order.indexOf(b.code);
    }

    return o;
});

答案 3 :(得分:0)

这是一种动态方式,允许您添加条件以便逐个比较。

var data = [{ age: 7, counter: 1, code: 'c' }, { age: 5, counter: 2, code: 'c' }, { age: 4, counter: 3, code: 'c' }, { age: 19, counter: 2, code: 'y' }, { age: 22, counter: 1, code: 'y' }, { age: 57, counter: 1, code: 's' }, { age: 80, counter: 2, code: 's' }];

Array.prototype.orderBy = function(...expresions) {
  var arr = this;
  return this.sort((a, b) => {
    var result;
    expresions.every(ex => (result = ex(a) - ex(b)) === 0)
    return result;
  });
}

var codeOrder = {
  c: 1,
  y: 2,
  s: 3
};
var result = data
  .orderBy(i => codeOrder[i.code], i => i.counter)
console.log(result);

如何运作

用法很简单:

dataArray.sortBy(ex1[, ex2[, ex3]])

此方法的每个参数都是一个函数,它接受dataArray中的一个项作为输入,并返回与该项相关的数字。如果任何表达式返回相对于相邻项目的相同值,则继续评估项目和adjecent上的下一个表达式,直到它们返回不同的结果或没有其他表达式进行测试。