如何通过布尔属性对对象数组进行排序

时间:2016-12-12 16:05:46

标签: javascript arrays sorting

我正在尝试通过其布尔属性对这个对象数组进行排序,但是,我很难找到一个使用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
}]

对此数组进行排序的最佳方法是什么?

3 个答案:

答案 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个以上的属性:这样我们首先给出一个你想要的布尔属性的优先级,给它一个大于所有优先级较低的属性之和的数值

相关问题