Javascript: фильтровать массив объектов на два

Мой объект массива похож на приведенный ниже пример.

list = [
{'name': 'test1', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456416646}
{'name': 'test2', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456416111}
{'name': 'test3', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456412541}
{'name': 'test4', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456414521}
]

Я могу отсортировать этот объект массива вот так.

return conversationList.sort((a, b) => {
  const firstTimestamp = a.lastMessage && a.lastMessage.createdAt ? a.lastMessage.createdAt : 0;
  const secondTimestamp = b.lastMessage && b.lastMessage.createdAt ? b.lastMessage.createdAt : 0;
  //Sort in DESC order
  return secondTimestamp - firstTimestamp;
});

Используя приведенный выше код, я могу отсортировать массив объектов в порядке убывания.

Теперь мое требование - первый массив фильтров на основе испин ключ., если для ispin установлено значение true, тогда я хочу создать новый объект массива с ключом штырь также в порядке убывания и еще один массив с ключом недавний в порядке убывания.

Итак, мой окончательный результат должен быть таким.

{ 
  // first array object with key pin : filter by ispin:true and order by descending order
  pin: [
 {'name': 'test1', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456416646}
 {'name': 'test3', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456412541}
 ],
 // second array object with ket recent : order by descending order and records which has ispin false
 recent: [
 {'name': 'test2', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456416111}
 {'name': 'test4', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456414521}
 ]
}

Я считаю, что вы можете добиться этого с помощью метода .reduce(). Вы можете создать новый массив, содержащий объекты с isPin:true, а затем отсортировать этот массив, как вы делали ранее.

Umair Ahmed 25.10.2018 10:59

@ T.J. Crowder: Я не думаю, что этот дубликат хороший. Я писал ответ, когда вы закрыли вопрос, который был связан с функцией groupBy (используя сокращение в качестве другого комментария). OP требует здесь группировка, а не фильтрацию, на этот вопрос может быть гораздо лучший ответ, чем для повторяющейся цели.

Pac0 25.10.2018 11:06

ах, да, я вижу в этом бессмыслицу (и просто понял это, глядя на свой ответ). Должен быть { pin: [{}] }

Pac0 25.10.2018 11:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы разделить список в зависимости от значения isPin, вы можете выполнить группировку следующим образом:

list = [
  {'name': 'test1', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456416646},
  {'name': 'test2', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456416111},
  {'name': 'test3', 'email': '[email protected]', 'ispin': true, 'updatedAt': 1540456412541},
  {'name': 'test4', 'email': '[email protected]', 'ispin': false, 'updatedAt': 1540456414521},
]

const groupBy = (array, fn) => array.reduce((result, item) => {
  const key = fn(item);
  if (!result[key]) result[key] = [];
  result[key].push(item);
  return result;
}, {});

const result = groupBy(list, x => x.ispin ? 'pin' : 'recent');
console.info(result);

(примечание: groupBy вдохновлено https://www.reddit.com/r/javascript/comments/4yi7e4/split_an_array_into_2_arrays_based_on_conditions/), и, как сказал его автор, вы можете вместо этого использовать groupBy из lodash, если вы используете эту библиотеку.

Другие вопросы по теме