如何将含嵌套对象的两个数组合并为无重复的单个数组
合并两个对象数组并合并重复键对应的值
给定两个对象数组:
const oldArr = [ { 'Tomorrow': [{ id: 2 }, { id: 4 }, { id: 3 }] }, { 'Saturday': [{ id: 2 }, { id: 4 }, { id: 3 }] } ] const newArr = [ { 'Monday': [{ id: 2 },{ id: 4},{ id: 3 }] }, { 'Tomorrow': [{ id: 1 },{ id: 5 }]} ]
需要将它们合并为无重复键的数组,重复键对应的数组内容要合并,预期结果如下:
[ { 'Tomorrow': [{ id: 2 }, { id: 4 }, { id: 3 }, { id: 1 }, { id: 5 }] }, { 'Saturday': [{ id: 2 }, { id: 4 }, { id: 3 }] }, { 'Monday': [{ id: 2 }, { id: 4 }, { id: 3 }] } ]
解决方案:使用reduce简洁实现
可以通过reduce统一处理合并逻辑,比嵌套循环更简洁易读:
// 合并两个数组为一个大数组,再用reduce处理 const mergedObj = [...oldArr, ...newArr].reduce((acc, curr) => { const key = Object.keys(curr)[0]; // 存在相同键则合并数组,不存在则直接添加 acc[key] = acc[key] ? [...acc[key], ...curr[key]] : curr[key]; return acc; }, {}); // 将处理后的对象转换为目标数组格式 const result = Object.entries(mergedObj).map(([key, value]) => ({ [key]: value })); console.log(result);
逻辑说明
- 先用扩展运算符
[...oldArr, ...newArr]把两个输入数组合并成一个数组; - 用
reduce遍历合并后的数组,维护一个以日期为键的累加器对象,存储对应合并后的id数组; - 遍历每个元素时,取出当前对象的唯一键,判断累加器中是否存在该键:存在则追加数组内容,不存在则直接赋值;
- 最后用
Object.entries和map把累加器对象转换回目标的对象数组格式。
内容的提问来源于stack exchange,提问作者giants22
相关产品推荐
相关产品推荐

