Задать вопрос
@JacobDrako

Как объединить объекты, у которых совпадает значение определённого свойства, суммируя другие свойства?

Вот мой массив:

let object = [
  {
    product: 'Монтажный комплект 5 м с вальцовкой; Основной',
    price: 0,
    selling_price: 3951,
    quantity: 1
  },
  {
    product: 'Монтажный комплект 5 м с вальцовкой; Основной',
    price: 2346,
    selling_price: 0,
    quantity: 0
  },
  {
    product: 'Монтажный комплект 5 м с вальцовкой; Основной',
    price: 0,
    selling_price: 3951,
    quantity: 1
  },
  {
    product: 'Монтажный комплект 5 м с вальцовкой; Основной',
    price: 2142,
    selling_price: 0,
    quantity: 0
  }
]

Делаю так:

let result = object.reduce(
      (callback, product) => (
        ((callback[product.product] ??= {
          ...product,
          selling_price: Number(),
        }).selling_price += +product.selling_price),
        // console.log("quantityhere", product.quantity),
        ((callback[product.product] ??= {
          ...product,
          quantity: Number(),
        }).quantity += +product.quantity),
        ((callback[product.product] ??= {
          ...product,
          price: Number(),
        }).price += +product.price),
        callback
      ),
      {}
    );
    
console.log(result)

Output result будет

{
  'Монтажный комплект 5 м с вальцовкой; Основной': {
    product: 'Монтажный комплект 5 м с вальцовкой; Основной',
    price: 4488,
    selling_price: 7902,
    quantity: 3
  }
}

Но тут есть ошибка, quantity вместо ожидаемых 2, получается 3.
Это связано с тем, что мы делаем сложение -> element += +element.

Я не понимаю как это фиксить и не знаю какие, другие, методы использовать для сложения этого массива.

Желаемый result в данном случае:

{
  'Монтажный комплект 5 м с вальцовкой; Основной': {
    product: 'Монтажный комплект 5 м с вальцовкой; Основной',
    price: 4488,
    selling_price: 7902,
    quantity: 2
  }
}
  • Вопрос задан
  • 152 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
function groupSum(arr, key, ...sumKeys) {
  const getKey = key instanceof Function ? key : n => n[key];

  return Object.values(arr.reduce((acc, n) => {
    const item = acc[getKey(n)] ??= Object.assign(
      structuredClone(n),
      Object.fromEntries(sumKeys.map(k => [ k, 0 ]))
    );
    sumKeys.forEach(k => item[k] += n[k]);
    return acc;
  }, {}));
}

// ваш случай
groupSum(arr, 'product', 'price', 'selling_price', 'quantity')

// элементам исходного массива не обязательно быть объектами,
// это могут быть и массивы
groupSum([
  [ 'A',   1, 10 ],
  [ 'A',   2, 20 ],
  [ 'A',   3, 30 ],
  [ 'B',   1,  5 ],
  [ 'B',  10,  5 ],
  [ 'B', 100,  5 ],
], 0, 1, 2) // [ [ 'A', 6, 60 ], [ 'B', 111, 15 ] ]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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