Объединить похожие объекты по ключу в массиве

Я хотел бы объединить похожие объекты и объединить количество.

Мой массив:

result = [
{itemNumber:'1288',quantity:700},
{itemNumber:'3298',quantity:1000},
{itemNumber:'1288',quantity:300}
]

Что я сделал:

 result = result.reduce((sum, val) => {
      for (let i in sum) {
          if (sum[i].itemNumber === val.itemNumber) {
              return sum 
          }
      }
      sum.push(val);
      return sum;
  }, []);

Мой ожидаемый результат:

result = [
    {itemNumber:'1288',quantity:1000},
    {itemNumber:'3298',quantity:1000},
    ]

Если есть способ сделать это с помощью lodash, я хотел бы знать, потому что я не смог его найти.

Спасибо за вашу помощь.


person Bar Levin    schedule 09.12.2020    source источник
comment
Как насчет stackoverflow.com/questions /38774763/   -  person Ben Stephens    schedule 09.12.2020


Ответы (2)


Вы можете хранить итоги в объекте и преобразовывать их обратно в массив. Однако при таком подходе вы должны заметить, что порядок элементов может измениться.

const input = [
  {itemNumber:'1288',quantity:700},
  {itemNumber:'3298',quantity:1000},
  {itemNumber:'1288',quantity:300}
];

// stores itemNumber, totalQuantity pairs.
// Example: {'1288': 1000, '3298': 1000} 
const totals = input.reduce((acc, val) => {
  const key = val.itemNumber;
  const { quantity } = val;
  const totalSoFar = acc[key] || 0;
  return {...acc, [key]: totalSoFar + quantity};
}, {});

const result = Object.entries(totals)
  .map(([itemNumber, quantity]) => ({itemNumber, quantity}));
console.log(result);

person Onur Arı    schedule 09.12.2020

Вы можете попробовать это, это похоже на ваш код

result = [
{itemNumber:'1288',quantity:700},
{itemNumber:'3298',quantity:1000},
{itemNumber:'1288',quantity:300}
];

let rt = Object.values(result.reduce((acc, v) => {
   if (!acc[v.itemNumber]) {
       acc[v.itemNumber] = {id: v.itemNumber, quantity: 0};
   }
   acc[v.itemNumber].quantity += v.quantity;
   return acc;
}, {}));




console.log(rt);

person jradelmo    schedule 09.12.2020