如何在JavaScript中按Name分组JSON数组并合并Product_Line__c?
合并相同Name的JSON数组条目实现方法
你可以用JavaScript的Array.prototype.reduce()方法来快速实现这个需求,这是处理分组合并类场景的常用方案,代码逻辑清晰易懂,适合新手理解:
// 原始JSON数组 const originalData = [ {"Name":"Marcelo Rocha","Product_Line__c":"SAP","Role":"Regional Manager, SAP Support Delivery, LATAM"}, {"Name":"Marcelo Rocha","Product_Line__c":"Business Objects","Role":"Regional Manager, SAP Support Delivery, LATAM"}, {"Name":"Marcelo Rocha","Product_Line__c":"Oracle Technology","Role":"Regional Manager, SAP Support Delivery, LATAM"}, {"Name":"Leonardo Gracioli","Product_Line__c":"SAP","Role":"Senior Support Engineer, SAP"}, {"Name":"Leonardo Gracioli","Product_Line__c":"Business Objects","Role":"Senior Support Engineer, SAP"}, {"Name":"Leonardo Gracioli","Product_Line__c":"Oracle Technology","Role":"Senior Support Engineer, SAP"}, {"Name":"Adriane Yonamine","Product_Line__c":"SAP","Role":"SAP Consultant"} ]; // 执行分组合并 const mergedData = Object.values(originalData.reduce((acc, item) => { // 用Name作为分组的唯一标识 const nameKey = item.Name; if (!acc[nameKey]) { // 首次遇到该Name,初始化分组项,把Product_Line__c存为数组方便后续追加 acc[nameKey] = { ...item, Product_Line__c: [item.Product_Line__c] }; } else { // 已存在该Name,直接追加产品线到数组 acc[nameKey].Product_Line__c.push(item.Product_Line__c); } return acc; }, {})).map(item => { // 把产品线数组转为逗号分隔的字符串 return { ...item, Product_Line__c: item.Product_Line__c.join(',') }; }); console.log(mergedData);
逻辑说明
reduce分组:遍历原始数组,用一个临时对象存储每个Name对应的分组数据,键为Name值,值为合并中的条目。- 初始化/追加产品线:首次碰到某个
Name时,复制条目并将Product_Line__c转为数组;后续碰到相同Name时,直接把新的产品线值追加到数组里。 - 转数组并格式化:用
Object.values()把临时对象转成数组,再通过map把每个条目的产品线数组转为逗号分隔的字符串。
可选优化:去重产品线
如果担心同一Name下出现重复的产品线值,可以用Set来去重,修改后的代码如下:
const mergedData = Object.values(originalData.reduce((acc, item) => { const nameKey = item.Name; if (!acc[nameKey]) { acc[nameKey] = { Name: item.Name, Role: item.Role, Product_Line__c: new Set([item.Product_Line__c]) }; } else { acc[nameKey].Product_Line__c.add(item.Product_Line__c); } return acc; }, {})).map(item => { return { ...item, Product_Line__c: Array.from(item.Product_Line__c).join(',') }; });
内容的提问来源于stack exchange,提问作者Luiz Marques
相关产品推荐
相关产品推荐

