【问题标题】:Merge similar objects by key in array通过数组中的键合并相似的对象
【发布时间】:2020-12-09 10:08:40
【问题描述】:

我想合并相似的对象并合并数量。

我的数组:

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 我想知道,因为我找不到。

感谢您的帮助。

【问题讨论】:

标签: javascript lodash


【解决方案1】:

您可以将总计存储在一个对象中并将它们转换回一个数组。但是,在这种方法中,您应该注意到元素的顺序可能会发生变化。

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);

【讨论】:

    【解决方案2】:

    你可以试试这个,和你的代码类似

    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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多