我有一个如下所示的对象数组,并且需要以这样的方式对其进行排序,使得具有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;
})
答案 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上的下一个表达式,直到它们返回不同的结果或没有其他表达式进行测试。