@hatealleverything

Как в массиве с одинаковым полем отсортировать данные по цене и удалить наименьшие из массива?

Добрый день.
Не доходит как можно в массиве с одинаковым полем отсортировать данные по цене и удалить наименьший из массива
[{ name: "Creeper's Cruel Painsaw", price: '2.53', rarity: 'Common' },
{ name: "Creeper's Cruel Painsaw", price: '2.50', rarity: 'Common' },
{ name: 'Cuffs of Oak and Yew', price: '3.94', rarity: 'Rare' },
{ name: 'Cuffs of Oak and Yew', price: '4.99', rarity: 'Rare' },
{ name: 'Curled Root-Staff', price: '2.91', rarity: 'Common' },
{ name: 'Curled Root-Staff', price: '3.33', rarity: 'Common' }]


У меня с одним и тем же именем более 10 объектов из них нужно выбрать самый маленький по цене. И таких имён тысячи, как можно это автоматизировать...? И проитерировать весь массив, а не только один объект или одно имя
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const newArr = [...arr]
  .sort((a, b) => a.name.localeCompare(b.name) || (a.price - b.price))
  .filter((n, i, a) => n.name === a[i - 1]?.name);

если какое-то значение name встречается лишь единожды, и такие объекты удалять не надо:

const newArr = [...arr]
  .sort((a, b) => a.name.localeCompare(b.name) || (a.price - b.price))
  .filter((n, i, a) => n.name === a[i - 1]?.name || n.name !== a[i + 1]?.name);

если сортировка по именам не нужна:

const newArr = [...arr]
  .sort((a, b) => a.price - b.price)
  .filter((n, i, a) => n !== a.find(m => m.name === n.name));

если сортировка по именам не нужна и единственные экземпляры надо сохранять:

const newArr = [...arr].sort((a, b) => a.price - b.price);

Object
  .values(newArr.reduce((acc, n) => ((acc[n.name] ??= []).push(n), acc), {}))
  .forEach(n => n.length !== 1 && newArr.splice(newArr.indexOf(n[0]), 1));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы