Сортировать массив объектов с несколькими критериями - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь отсортировать массив объектов по значению объектов. Но мне нужны определенные элементы в массиве, которые достигают определенных критериев, чтобы быть первыми, и другие элементы, которые достигают других критериев, чтобы быть последними. В противном случае его следует отсортировать по заголовку. Вот пример того, что я имею в виду:

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 недели с этого момента, этот элемент должен быть первым, и он должен сортировка по дате,
  • Если для флага установлено значение false, этот элемент должен быть последним, но сортироваться по заголовку
  • В противном случае сортировать по заголовку

(I ' Я буду использовать момент для дат.)

Итак, я знаю, как отсортировать массив объектов, но как я могу также добавить эти 3 критерия?

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

        return 0;
    });

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Функция 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;
    });

Это псевдокод, но эта идея должна сработать и ее будет легко понять при ее чтении.

0 голосов
/ 30 марта 2020

Похоже, что вы можете решить эту проблему несколькими более простыми шагами:

  1. Создайте три массива из ваших данных, первый, средний и последний, пройдя по массиву и проверив если. дата меньше недели, добавьте к первому b. флаг ложен, добавьте к последнему c. ни одно из вышеперечисленного не соответствует действительности, добавьте к середине

  2. Сортируйте эти массивы на основе указанных критериев для каждого размещения

  3. return first.concat (mid .concat (последняя))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...