![](/img/trans.png)
[英]Lodash - Move object to first place in array than sort by another property
[英]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.