提问人:marukobotto 提问时间:5/1/2023 更新时间:5/1/2023 访问量:71
在数组中查找匹配的对象属性并合并到新对象中 [已关闭]
Find matching object property in array and merge into new object [closed]
问:
我有一个对象数组,我想在其中找到具有相同名称属性值的对象,然后通过添加它们的值和子值将它们合并为单个对象。
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。所以这并不重要。我尝试使用过滤器,但无法找到适合我要求的解决方案
答:
1赞
XMehdi01
5/1/2023
#1
仅使用 Array#reduce
,查看 ent 对象是否已经存在于带有 Array#findIndex
的 umulator 中,然后 Values 和 Subvalues 应该分别与当前对象 Values 和 Subvalues 累积,否则在 umulator 中添加当前 ect:name
curr
acc
obj
acc
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,然后使用reduce
name
Object.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
你真的通过答案发布了一个新组吗?
评论
filter