我正在尝试通过其布尔属性对这个对象数组进行排序,但是,我很难找到一个使用javascripts'sort'方法的解决方案
我正在尝试对它进行排序,因此数组中的顶部项目将是'offer = true',然后是'shortlisted = true',最后是'rejected = true'。
var toSort = [{
offer: false,
shortlisted: true,
rejected: false,
stage: 2
}, {
offer: false,
shortlisted: false,
rejected: true,
stage: null
}, {
offer: true,
shortlisted: true,
rejected: false,
stage: null
}, {
offer: false,
shortlisted: true,
rejected: false,
stage: 1
}];
这是我想要实现的最终结果
[{
offer: true,
shortlisted: true,
rejected: false,
stage: null
}, {
offer: false,
shortlisted: true,
rejected: false,
stage: 1
}, {
offer: false,
shortlisted: true,
rejected: false,
stage: 2
}, {
offer: false,
shortlisted: false,
rejected: true,
stage: null
}]
对此数组进行排序的最佳方法是什么?
答案 0 :(得分:7)
您可以像这样使用sort()
。
var toSort = [{
offer: false,
shortlisted: true,
rejected: false,
stage: 2
}, {
offer: false,
shortlisted: false,
rejected: true,
stage: null
}, {
offer: true,
shortlisted: true,
rejected: false,
stage: null
}, {
offer: false,
shortlisted: true,
rejected: false,
stage: 1
}];
var result = toSort.sort(function(a, b) {
return b.offer - a.offer ||
b.shortlisted - a.shortlisted ||
b.rejected - a.rejected
})
console.log(result)
答案 1 :(得分:0)
一种方法是为每个对象分配一个数字分数,为更高优先级的值设置更高的分数。例如:
var scoreObj = function(o) {
var score = 0;
if(o.offer) {
score+=100;
}
if(o.shortlisted) {
score+=10;
}
if(o.rejected) {
score+=1;
}
return score;
};
var sorted = toSort.sort(function(a,b){
return scoreObj(b) - scoreObj(a);
});
答案 2 :(得分:0)
一种简单的方法:
toSort.sort(function(a, b){
var numberA = a.offer * 5 + a.shortlisted * 3 + a.rejected;
var numberB = b.offer * 5 + b.shortlisted * 3 + b.rejected;
return numberA < numberB
});
为什么会这样:
1)我们可以将布尔值视为0或1,所以如果a.offer为真,我们将5加到numberA,如果不是0
2)如果要约属性为真,即使所有其他属性都为真,要约仍将首先出现(因为5> 1 + 3 = 4)
对于3个以上的属性:这样我们首先给出一个你想要的布尔属性的优先级,给它一个大于所有优先级较低的属性之和的数值