繁体   English   中英

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

[英]javascript - sort by multiple criteria - first by another array and then by another property inside

我有一个如下所示的对象数组,需要按以下方式对它进行排序:c项首先出现,y则是s。 同样,例如在c中,它也应按计数器排序,即c-counter 1,c-counter 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;
})

您可以将对象用于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); 

您需要将数组指定为

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);
   }
})

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

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;
});

这是一种动态方式,可让您添加条件以进行比较。

 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一项作为输入并返回与该项有关的数字。 如果任何一个表达式相对于相邻项返回相同的值,则评估将继续在该项和相邻项上使用下一个表达式,直到它们返回不同的结果或没有其他要测试的表达式为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM