使用多个条件对对象数组进行排序

时间:2020-03-29 23:00:20

标签: javascript arrays sorting

我正在尝试通过对象值对对象数组进行排序。但是,我需要数组中符合特定条件的某些项目排在第一位,而其他符合不同条件的项目则排在最后。否则,应按标题排序。这是我的意思的示例:

let arr = [
    { flag: true, title: 'Orange', dateAdded: 'Some Date' },
    { flag: true, title: 'Apple', dateAdded: 'Some Date' },
    { flag: false, title: 'Peach', dateAdded: 'Some Date' },
    { flag: true, title: 'Plum', dateAdded: 'Some Date' },
    { flag: true, title: 'Mango', dateAdded: 'Some Date' },
    { flag: true, title: 'Banana', dateAdded: 'Some Date' },
    { flag: false, title: 'Tangerine', dateAdded: 'Some Date' }
];

以下是标准:

  • 如果日期是从现在开始的1周内,则该项目应位于第一个位置,并应按日期排序,
  • 如果将flag设置为false,则该项目应排在最后,但按标题排序
  • 否则,按标题排序

(我将使用时刻作为日期。)

所以我知道如何对对象数组进行排序,但是我又如何添加这三个条件?

arr.sort((a, b) => {
        if (a.title > b.title) return 1;
        if (a.title < b.title) return -1;

        return 0;
    });

2 个答案:

答案 0 :(得分:1)

sort函数可在2个项目之间工作,因此只需编写比较2个项目的代码,您就可以在这2个项目之间定义应该赢取哪个项目。

arr.sort((a, b) => {
        if (a.withinAWeek()) {
          if (b.withinAWeek()) {
            return (a.date < b.date) ? -1 : 1;
          } else {
            return -1;
          }
        }
        if (a.flag) {
          if (b.flag) {
            return (a.date < b.date) ? -1 : 1;
          } else {
            return 1;
          }
        }
        if (a.title > b.title) return 1;
        if (a.title < b.title) return -1;

        return 0;
    });

那是伪代码,但是这个想法应该可行,并且在阅读时非常容易理解。

答案 1 :(得分:0)

听起来您可以通过几个更简单的步骤解决此问题:

  1. 通过遍历数组并检查是否:从数据中创建三个数组,第一个,中间,最后一个 一种。日期不到一周,请先添加 b。标志为假,添加到最后 C。以上都不是,请添加到中间

  2. 根据每个展示位置的指定条件对这些数组进行排序

  3. 首先返回.concat(mid.concat(last))