@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
  }
}
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const groupSum = (arr, idKey, ...sumKeys) =>
  Object.values(arr.reduce((acc, n) => (
    acc[n[idKey]] ??= sumKeys.reduce((group, k) => (group[k] = 0, group), { ...n }),
    sumKeys.forEach(k => acc[n[idKey]][k] += n[k]),
    acc
  ), {}));


const result = groupSum(arr, 'product', 'price', 'selling_price', 'quantity');
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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