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

新手上路,请多包涵

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

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

原文由 James Moran 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 648
2 个回答

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

原文由 Nenad Vracar 发布,翻译遵循 CC BY-SA 3.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 个以上的属性:通过这种方式,我们首先为您想要的布尔属性赋予优先级,方法是给它一个大于所有优先级较低的属性之和的数值

原文由 juvian 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题