Javascript 按多个属性对对象数组进行排序
我有这样一个对象数组:Javascript 按多个属性对对象数组进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有这样一个对象数组: var a = [ { id: 1, score: 1, isCut: false, dnf: false }, { id: 2, score: 2, isCut: false, dnf: false }, { id: 3, score: 3, isCut: false, dnf: false }, { id: 4, score: 4, isCut: false, dnf: false }, { id: 5, score: 5, i
var a = [
{ id: 1, score: 1, isCut: false, dnf: false },
{ id: 2, score: 2, isCut: false, dnf: false },
{ id: 3, score: 3, isCut: false, dnf: false },
{ id: 4, score: 4, isCut: false, dnf: false },
{ id: 5, score: 5, isCut: true, dnf: true },
{ id: 6, score: 6, isCut: true, dnf: false },
{ id: 7, score: 7, isCut: true, dnf: false },
{ id: 8, score: 8, isCut: true, dnf: false },
{ id: 9, score: 9, isCut: true, dnf: false },
{ id: 10, score: 0, isCut: false, dnf: false },
{ id: 11, score: -1, isCut: false, dnf: false },
{ id: 12, score: -2, isCut: false, dnf: true },
{ id: 13, score: -3, isCut: false, dnf: false },
{ id: 14, score: -4, isCut: false, dnf: false },
{ id: 15, score: -5, isCut: false, dnf: false },
{ id: 16, score: 10, isCut: true, dnf: false }
];
我需要按照以下条件对数组进行分组和排序:
dnf
为真,则对象将进入底部;所有dnf
-对象应按分数排序isCut
为true,则对象位于底部,但位于dnf
s上方;所有isCut
-对象应按分数排序score
排序,如果分数相等,则按id
使用数组中的比较器函数 您可以在此处查看答案:(更新)以下是您在评论中提到的问题的答案
a.sort(function(a, b) {
if (a.dnf != b.dnf) {
return a.dnf ? 1 : -1;
}
if (!(a.dnf && b.dnf) && a.isCut != b.isCut) {
return a.isCut ? 1 : -1;
}
if (a.score != b.score) {
return b.score - a.score; // descending
}
return b.id - a.id; // descending
});
结果:
[
{"id":4,"score":4,"isCut":false,"dnf":false}, // the rest: order by score, id
{"id":3,"score":3,"isCut":false,"dnf":false}, //
{"id":2,"score":2,"isCut":false,"dnf":false}, //
{"id":1,"score":1,"isCut":false,"dnf":false}, //
{"id":10,"score":0,"isCut":false,"dnf":false}, //
{"id":11,"score":-1,"isCut":false,"dnf":false}, //
{"id":13,"score":-3,"isCut":false,"dnf":false}, //
{"id":14,"score":-4,"isCut":false,"dnf":false}, //
{"id":15,"score":-5,"isCut":false,"dnf":false}, //
{"id":16,"score":10,"isCut":true,"dnf":false}, // isCut: order by score, id
{"id":9,"score":9,"isCut":true,"dnf":false}, //
{"id":8,"score":8,"isCut":true,"dnf":false}, //
{"id":7,"score":7,"isCut":true,"dnf":false}, //
{"id":6,"score":6,"isCut":true,"dnf":false}, //
{"id":5,"score":5,"isCut":true,"dnf":true}, // dnf: order by score, id
{"id":12,"score":-2,"isCut":false,"dnf":true} //
]
这是一种不同的方法,如果使用
dnf
和isCut
属性而不同时查看这两种属性,则使用数组作为排序顺序,排序顺序是不规则的。如果我们将两个值都带到真值表,那么排序顺序不会反映所需的顺序
要更正排序顺序,我建议使用数组来获得正确的顺序
var data=[{id:1,分数:1,isCut:false,dnf:false},{id:2,分数:2,isCut:false,dnf:false},{id:3,分数:3,isCut:false,dnf:false},{id:4,分数:4,isCut:false,dnf:false},{id:5,分数:5,isCut true,dnf:true},{id:6,isCut true,dnf:false,{id:7,isCut false,dnf:false},{id:8,分数:8,isCut:true,dnf:false},{id:9,分数:9,isCut:true,dnf:false},{id:10,分数:0,isCut:false,dnf:false},{id:11,分数:-1,isCut:false,dnf:false},{id:12,分数:-2,isCut:false,dnf:true},{id:13,分数:-3,isCut:false,dnf:false},{id:14,分数:-4,isCut:false,dnf:false},{id:15,分数:-5,isCut:false,dnf:false},{id:16,分数:10,isCut:true,dnf:false}];
数据排序(函数(a,b){
函数顺序(dnf,isCut){返回[0,1,3,2][dnf*2+isCut];}
退货订单(a.dnf,a.isCut)-订单(b.dnf,b.isCut)| | b.score-a.score;
});
console.log(数据);
.as控制台包装{最大高度:100%!重要;顶部:0;}
Array.sort接受一个比较器函数。是的,但是如何实现它,这是个问题。看看这个,我希望这会对你有所帮助:)这是按dnf
首先排序。isCut
不会被准确排序。你首先需要所有isCut
为true的项,然后是isCut
为false的项e、 @amberlamps我不明白。你不想让dnf
对象放在底部吗?那么我们应该先按dnf
排序。你理解正确,但他想isCut
在上面,如果它是真的
,那么它可以像真的
,真的
,假的
。@amberlamps明白了!谢谢你的解释。你必须用很多不同的数据来测试它才能真正确定,但到目前为止我看起来很好。+1
2*dnf+isCut
dnf isCut value order
-------- -------- -------- --------
0 0 0 0
0 1 1 1
1 1 3 2
1 0 2 3