如何按其布尔属性对对象数组进行排序

7
我正在尝试通过其布尔属性对该对象数组进行排序,但我在使用JavaScript的“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
}]

什么是对这个数组排序的最佳方法?


你是如何按照布尔属性进行排序的?你能更具体一些吗? - Sara Fuerst
你尝试了什么?它是如何失败的?你想要数组按照什么方式排序? - user5734311
这是按哪个字段排序的? - WillardSolutions
抱歉,我已更新了帖子。我正在尝试根据布尔属性的真/假对数组进行排序。在这种情况下,它应该按照以下方式对每个项目进行排序 - 首先是“提供=真”,然后是“被短列=真”,最后是“被拒绝=真”。 - James Moran
2
很高兴你接受了我的答案,但我认为@NenadVracar的答案是最好的 ;) - juvian
3个回答

13
你可以像这样使用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)


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);
    });

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)如果“offer”属性为真,则即使所有其他属性都为真,“offer”也将首先显示(因为5> 1 + 3 = 4)
对于超过3个属性:通过为其赋予大于所有较低优先级属性之和的数字值,我们优先考虑您想要的布尔属性。

那为什么不是4和2而是5和3呢?这对我来说更有二进制意义...然而,Nenad的答案看起来更好。 - Redu
@Redu 确实 4 和 2 也可以工作,但我认为另一个答案更好 ;) - juvian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接