如何修改合并函数实现title为对象类型的两个数组去重合并
问题原因
你原有代码的问题在于 Map 对对象类型的key是按引用匹配的,两个内容完全一致但引用不同的title对象会被识别为两个不同的key,因此无法触发合并逻辑。
解决方案
可以将title对象序列化为字符串作为Map的唯一key,只要title对象的内容完全一致就会被判定为同一分组,修改后的代码如下:
merged = (data1, data2) => { let arr = data1.concat(data2); // 用序列化后的title字符串作为key,值存储[原title对象, 子项去重Map] let titleGroups = new Map(); arr.forEach(({title, data}) => { // 序列化title生成唯一key,保证内容相同的title对象得到相同key const titleKey = JSON.stringify(title); if (!titleGroups.has(titleKey)) { titleGroups.set(titleKey, [title, new Map()]); } const [, subMap] = titleGroups.get(titleKey); data.forEach(o => subMap.set(o._id, o)); }); // 转换为目标格式返回 return Array.from(titleGroups.values(), ([title, subMap]) => ({ title, data: [...subMap.values()], })); };
适配说明
如果你的title对象可能存在字段顺序不同但内容一致的场景(比如{title:'Sides', id:1}和{id:1, title:'Sides'}),可以将序列化的逻辑替换为按字段排序后再生成字符串,避免误判为不同分组。
如果你的title判断逻辑不需要全字段匹配,只需要匹配title字段的值,也可以直接用title.title作为key,性能比序列化更高:
// 仅匹配title字段值的场景,替换key生成逻辑即可 const titleKey = title.title;
内容的提问来源于stack exchange,提问作者DiveDive
相关产品推荐
相关产品推荐

