按多个属性对对象数组进行排序 [英] Sort an array of objects by multiple properties
本文介绍了按多个属性对对象数组进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个这样的对象数组:
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
-objects 都应该按分数排序 - 如果
isCut
为真,则对象下到底部,但在dnf
s之上;所有isCut
-对象都应按分数排序 - rest 应按
score
排序,如果分数相等,则按id
解决方案
(更新)这是您在评论中提到的问题的答案.
a.sort(function(a, b) {如果(a.dnf != b.dnf){返回 a.dnf ?1:-1;}如果 (!(a.dnf && b.dnf) && a.isCut != b.isCut) {返回 a.isCut ?1:-1;}如果(a.score != b.score){返回 b.score - a.score;//降序}返回 b.id - a.id;//降序});
结果:
<预><代码>[{"id":4,"score":4,"isCut":false,"dnf":false},//其余:按分数排序,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:按分数排序,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: 按分数排序,id{"id":12,"score":-2,"isCut":false,"dnf":true}//]I have an array of objects like this:
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 }
];
I need to group and sort the array by the following criteria:
- if
dnf
is true, object goes to bottom; alldnf
-objects should be sorted by score - if
isCut
is true, object goes to bottom, but abovednf
s; allisCut
-objects should be sorted by score - rest should be sorted by
score
, and if the scores are equal, byid
解决方案
(Updated) Here's the answer of question you mentioned in comment.
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
});
Result:
[
{"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} //
]
这篇关于按多个属性对对象数组进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文