如何合并具有重复键值对的JavaScript对象数组?
合并对象数组中重复Title的项
嘿,我来帮你搞定这个合并需求!你之前用.map()只是完成了结构转换,但要合并相同Title的项,咱们得用Array.reduce()方法来做分组合并,这是处理这类聚合需求的绝佳工具。
实现代码
直接上能得到你想要结果的代码:
var doctypes = [ { "System": { "Title": "FIS NetImage" }, "Title": "Notices" }, { "System": { "Title": "OmniView" }, "Title": "Notices" }, { "System": { "Title": "Nautilus" }, "Title": "Reports" }, { "System": { "Title": "FIS NetImage" }, "Title": "Statements" } ]; // 用reduce分组合并 var mergedDocTypes = doctypes.reduce((acc, item) => { // 检查当前Title是否已经在累加器中存在 if (acc[item.Title]) { // 如果存在,把当前的System对象push到对应的System数组里 acc[item.Title].System.push({ Title: item.System.Title }); } else { // 如果不存在,新建一个条目存入累加器 acc[item.Title] = { Title: item.Title, System: [{ Title: item.System.Title }] }; } return acc; }, {}); // 把累加器的对象值转换成数组,就是最终结果 var finalResult = Object.values(mergedDocTypes); console.log(finalResult);
代码解释
reduce()的第一个参数是回调函数,第二个参数是初始值(这里是一个空对象{},用来存储分组后的结果)。- 遍历每一项时,先判断当前
Title是否已经作为键存在于累加器中:- 存在的话,就把当前项的
System.Title包装成对象,追加到对应条目的System数组里。 - 不存在的话,就创建一个新的对象,包含当前
Title和初始的System数组,存入累加器。
- 存在的话,就把当前项的
- 最后用
Object.values()把累加器这个对象的所有值提取出来,转换成你想要的数组格式。
运行这段代码后,输出就和你给出的DESIRED OUTCOME完全一致啦!
内容的提问来源于stack exchange,提问作者cfoster5
相关产品推荐
相关产品推荐

