Задать вопрос
SaveLolliPoP
@SaveLolliPoP
1 / 0 = ∞

Как отсортировать массив, при этом сравнивать разные ключи?

Есть два массива:

array1 = [
  {createdDate: 1, finishedDate: 5, ...}
  ...
]

array2 = [
  {createdDate: 3, ...}
]

Это условный массив.
Мне нужно вывести все элементы этого массива в отсортированном порядке. Знаю, что можно отсортировать массив вот так:

array.sort(function(a, b) {
  return a - b;
});

В голове идея, соединить эти 2 массива и .sort придать какие то условия. Но как это сделать?
Условно пробегаясь по новому массиву, проверять есть ли у элемента заполненный finishedDate, если нет то у элемента массива сравниваем createdDate, если он заполнен, то у элемента "а" сравниваем элемент finishedDate, далее если у "b" нет finishedDate, то элемент массива а.finishedDate - b.createdDate.

Но как это реализовать?
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
arr.sort((a,b) => 
  (a.hasOwnProperty("finishedDate") ? a.finishedDate : a.createdDate) 
  - 
  (b.hasOwnProperty("finishedDate") ? b.finishedDate : b.createdDate)
)
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
arr.sort((a, b) => (a.finishedDate || a.createdDate) - (b.finishedDate || b.createdDate));

UPD. Вынесено из комментариев:

Добавляется еще один дополнительный параметр, такой как статус)
status: 'started' или status: 'finished'.
Как можно поставить элемент со статусом started в начало массива?

arr.sort((a, b) => {
  const aStatus = a.status !== 'started';
  const bStatus = b.status !== 'started';
  const aDate = a.finishedDate || a.createdDate;
  const bDate = b.finishedDate || b.createdDate;

  return (aStatus - bStatus) || (aDate - bDate);
});

UPD. Вынесено из комментариев:

Ругается на: aStatus - bStatus
The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.


Но если присвоить тип этим переменным эни, то работает супер-пупер

Не надо any, превращайте значения в числа явным образом:

const aStatus = +(a.status !== 'started');
const bStatus = +(b.status !== 'started');
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы