【问题标题】:Sort array of objects by booleans, then by numbers (javascript)按布尔值排序对象数组,然后按数字(javascript)
【发布时间】:2018-08-06 12:46:59
【问题描述】:

我有一个对象数组,我想按照以下两条规则对它们进行排序(按优先级排序):

“departeYet”属性为真的对象必须在开头 然后必须按数字顺序(“数字”属性)对对象进行排序

这样就好了:

  • 真:005
  • 真:007
  • 真:027
  • 假:009
  • 假:020

这是我们感兴趣的对象部分的结构:

var notSortedData = {
                        number: number, // it's a string
                        departedYet: scheduled_date, // true or false
                    }

                    sortedTrains.push(notSortedData);

因此,notSortedData 通过 for 循环被推入 sortedTrains。

然后,我需要对其进行排序:

sortedTrains.sort(function(a, b) {
        // sorting algorithm here
    });

我该怎么办?谢谢。

【问题讨论】:

  • 我不相信您了解sort 函数的工作原理以及它的参数函数应该返回什么。请参阅docs。简短的回答:你不需要实现一个排序算法,你只需要一个compare函数。
  • 只需排序两次,首先按数字,然后按布尔值。
  • @ PM 77-1,Jonathan Gray 找到了一种对其进行排序的方法。

标签: javascript jquery sorting


【解决方案1】:

您可以使用这个原始答案(我故意让它更详细):

sortedTrains.sort(function(a, b) {
    if(a.departedYet === b.departedYet)
        return a.number-b.number;
    else if(a.departedYet)
        return -1;
    else return 1;
});

...或者这个更短的等价物:

sortedTrains.sort(function(a, b) {
    if(a.departedYet === b.departedYet)
        return a.number-b.number;
    return a.departedYet ? -1 : 1;
});

【讨论】:

  • 这个版本的排序更通用 sortedTrains.sort(function(a, b) { if(a.departedYet === b.departedYet) return 0; else if(a.departedYet) return - 1; 否则返回 1; });
  • @DamirBeylkhanov 您的方法将仅按departedYet 值排序,它完全忽略数字值。
猜你喜欢
  • 2021-09-30
  • 2019-12-22
  • 2021-10-13
  • 2023-03-25
  • 1970-01-01
  • 2012-10-05
  • 2021-12-28
  • 2019-01-16
相关资源
最近更新 更多