@Bogdnan123

Как в массиве сосчитать объекты с одинаковыми значениями свойства?

Есть массив объектов, представляющий корзину. Как сделать, чтобы объекты были уникальны и им добавилось свойство, содержащее количество повторений в исходных данных?

Например, есть:

const arr = [
  { name: 'bob' },
  { name: 'sara' },
  { name: 'anna' },
  { name: 'bob' },
  { name: 'bob' },
]

Должно стать:

const arr = [
  { name: 'bob', qty: 3 },
  { name: 'sara', qty: 1 },
  { name: 'anna', qty: 1 },
]
  • Вопрос задан
  • 578 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега React
Если говорить именно об уникализации массива, то

const uniqueWithCount = (arr, idKey, countKey) =>
  Object.values(arr.reduce((acc, n) => (
    (acc[n[idKey]] ??= { ...n, [countKey]: 0 })[countKey]++,
    acc
  ), {}));


const result = uniqueWithCount(arr, 'name', 'qty');

Но вообще-то, в корзине элементы должны быть уникальны изначально, надо в момент добавления проверять наличие элемента, если есть - увеличивать его счётчик, нет - добавить со счётчиком, имеющим единицу в качестве значения. Как это может выглядеть:

const addToCart = product =>
  setCart(cart => cart.some(n => n.id === product.id)
    ? cart.map(n => n.id === product.id ? { ...n, qty: n.qty + 1 } : n)
    : [ ...cart, { ...product, qty: 1 } ]
  );

https://jsfiddle.net/6etkvyr9/
Ответ написан
@good_beginer
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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