在数组中查找匹配的对象属性并合并到新对象中 [已关闭]

Find matching object property in array and merge into new object [closed]

提问人:marukobotto 提问时间:5/1/2023 更新时间:5/1/2023 访问量:71

问:


想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

7个月前关闭。

我有一个对象数组,我想在其中找到具有相同名称属性值的对象,然后通过添加它们的值和子值将它们合并为单个对象。

const arr = [
 { id: 1, name: 'a', value: 2, subvalue: 3 }, 
 { id: 2, name: 'b', value: 4, subvalue: 3 },
 { id: 3, name: 'c', value: 4, subvalue: 3 },
 { id: 4, name: 'b', value: 3, subvalue: 4 } 
]

预期输出

[
 { id: 1, name: 'a', value: 2, subvalue: 3 }, 
 { id: 2, name: 'b', value: 7, subvalue: 7 },
 { id: 3, name: 'c', value: 4, subvalue: 3 }
]

新对象的 id 可以是 2,也可以是 4。所以这并不重要。我尝试使用过滤器,但无法找到适合我要求的解决方案

JavaScript 数组 对象 ecmascript-6

评论

0赞 XMehdi01 5/1/2023
单独使用并不能解决这个任务,看看我的答案!filter
0赞 pilchard 5/1/2023
这回答了你的问题吗?对对象数组进行分组的最有效方法
0赞 pilchard 5/1/2023
对象的 Javascript 数组、分组和求和项目或对数组进行分组然后对值求和或如何对对象数组进行分组和求和 javascript?

答:

1赞 XMehdi01 5/1/2023 #1

仅使用 Array#reduce,查看 ent 对象是否已经存在于带有 Array#findIndex 的 umulator 中,然后 Values 和 Subvalues 应该分别与当前对象 ValuesSubvalues 累积,否则在 umulator 中添加当前 ect:namecurraccobjacc

const arr = [ { id: 1, name: 'a', value: 2, subvalue: 3 }, { id: 2, name: 'b', value: 4, subvalue: 3 }, { id: 3, name: 'c', value: 4, subvalue: 3 }, { id: 4, name: 'b', value: 3, subvalue: 4 } ];
const result = arr.reduce((acc, cur) => {
  const index = acc.findIndex((obj) => obj.name === cur.name);
  if (index !== -1) {
    acc[index] = {
      ...acc[index],
      value: acc[index].value + cur.value,
      subvalue: acc[index].subvalue + cur.subvalue,
    };
  } else {
    acc.push(cur);
  }
  return acc;
}, []);
console.log(result);

如果您不想保留第一个(原始)对象,而希望使用最后一个(最新)合并对象的 ID,只需在合并它们时替换为即可。id...acc[index]...cur

2赞 cmgchess 5/1/2023 #2

您可以使用 to group by,然后使用reducenameObject.values

const arr = [
 { id: 1, name: 'a', value: 2, subvalue: 3 }, 
 { id: 2, name: 'b', value: 4, subvalue: 3 },
 { id: 3, name: 'c', value: 4, subvalue: 3 },
 { id: 4, name: 'b', value: 3, subvalue: 4 } 
]

const res = Object.values(arr.reduce((acc,curr) => {
  if(!acc[curr.name]){
    acc[curr.name] = curr
  } else {
    acc[curr.name].value += curr.value
    acc[curr.name].subvalue += curr.subvalue
  }
  return acc
},{}))

console.log(res)

或者整个 if else 逻辑是单行的,但可读性较差

const arr = [
 { id: 1, name: 'a', value: 2, subvalue: 3 }, 
 { id: 2, name: 'b', value: 4, subvalue: 3 },
 { id: 3, name: 'c', value: 4, subvalue: 3 },
 { id: 4, name: 'b', value: 3, subvalue: 4 } 
]

const res = Object.values(arr.reduce((acc, curr) => {
    acc[curr.name] = acc[curr.name] ? {...acc[curr.name], value: acc[curr.name].value + curr.value, subvalue: acc[curr.name].subvalue + curr.subvalue} : curr
    return acc
}, {}))

console.log(res)

评论

0赞 pilchard 5/1/2023
你真的通过答案发布了一个新组吗?