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

    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/
    Ответ написан
    4 комментария