Как отсортировать массив по свойству объекта с несколькими условиями в Javascript - PullRequest
0 голосов
/ 13 июля 2020

Я читал похожие решенные задачи, но не мог понять, как применить это в моем случае.

Итак, у меня есть несортированный массив объектов:

const queues = [
  {"floor":2,"direction":"REQUEST_FLOOR"},
  {"floor":1,"direction":"REQUEST_FLOOR"},
  {"floor":5,"direction":"CALL_DOWN"},
  {"floor":8,"direction":"CALL_DOWN"},
  {"floor":7,"direction":"REQUEST_FLOOR"},
  {"floor":6,"direction":"CALL_DOWN"}
];

I Я хотел бы отсортировать его по:


const queues = [
  {"floor":1,"direction":"REQUEST_FLOOR"},
  {"floor":2,"direction":"REQUEST_FLOOR"},
  {"floor":7,"direction":"REQUEST_FLOOR"},
  {"floor":8,"direction":"CALL_DOWN"},
  {"floor":6,"direction":"CALL_DOWN"},
  {"floor":5,"direction":"CALL_DOWN"},
];

Итак, правила приоритета, которые я хочу применить, следующие:

  1. Сортировать сначала «REQUEST_FLOOR», а затем только «CALL_DOWN».
  2. Сортировка «REQUEST_FLOOR» по возрастанию и «CALL_DOWN» по убыванию.

Я могу заставить его работать, разделив его на 2 разных массива, сортируя, а затем объединяя в конце . Вот мой код:

const requestFloors = queues.filter(queue => queue.direction === "REQUEST_FLOOR");
const callDownFloors = queues.filter(queue => queue.direction === "CALL_DOWN");
requestFloors.sort((a,b) => a.floor - b.floor);
callDownFloors.sort((a,b) => b.floor - a.floor);
const newQueues = [...requestFloors,...callDownFloors];

Вопрос: вместо фильтрации + сортировки я хотел бы просто использовать sort (), поэтому, возможно, что-то вроде этого: queues.sort((a,b) => b.direction.localeCompare(a.direction) || a.floor - b.floor ); Однако этот код сортирует направление правильно, но проблема в том, что он по-прежнему сортирует пол по возрастанию в обоих направлениях.

Как добиться того же результата, используя только sort ()? Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Вы можете использовать функцию сортировки:

queues.sort((el1, el2) => {
     if(el1.direction ==  el2.direction){
         if(el1.direction === "REQUEST_FLOOR")
            return el1.floor - el2.floor 
         else 
            return el2.floor - el1.floor
     } 
     else if(el1.direction === "REQUEST_FLOOR") 
         return -1;
     else 
         return 1;
})

Вывод:

[
   {
      "floor":1,
      "direction":"REQUEST_FLOOR"
   },
   {
      "floor":2,
      "direction":"REQUEST_FLOOR"
   },
   {
      "floor":7,
      "direction":"REQUEST_FLOOR"
   },
   {
      "floor":8,
      "direction":"CALL_DOWN"
   },
   {
      "floor":6,
      "direction":"CALL_DOWN"
   },
   {
      "floor":5,
      "direction":"CALL_DOWN"
   }
]
1 голос
/ 13 июля 2020

Если направление одинаково в обоих сравниваемых элементах, вы можете условно выбрать оценку других столбцов на основе направления:

queues.sort((a,b) =>
  (a.direction=="CALL_DOWN") - (b.direction=="CALL_DOWN") ||
  (a.direction == "CALL_DOWN"
    ? b.floor - a.floor
    : a.floor - b.floor)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...