如何合并具有相同address值的JSON对象?
合并具有相同address值的JSON对象解决方案
原始输入示例
[ { "address": "123 Main St", "name": "Alice", "phone": "555-1234" }, { "address": "123 Main St", "email": "alice@example.com" }, { "address": "456 Oak Ave", "name": "Bob", "email": "bob@example.com" } ]
期望合并结果
[ { "address": "123 Main St", "name": "Alice", "phone": "555-1234", "email": "alice@example.com" }, { "address": "456 Oak Ave", "name": "Bob", "email": "bob@example.com" } ]
JavaScript 实现方案
基础合并(后出现的属性覆盖前序同属性)
const mergeByAddress = (arr) => { // 以address为键分组存储对象 const groupedMap = arr.reduce((acc, current) => { const addressKey = current.address; // 合并对象:已有则扩展,无则直接存入 acc[addressKey] = acc[addressKey] ? {...acc[addressKey], ...current} : {...current}; return acc; }, {}); // 将分组对象转为数组返回 return Object.values(groupedMap); }; // 测试使用 const originalData = [ {"address": "123 Main St", "name": "Alice", "phone": "555-1234"}, {"address": "123 Main St", "email": "alice@example.com"}, {"address": "456 Oak Ave", "name": "Bob", "email": "bob@example.com"} ]; const mergedResult = mergeByAddress(originalData); console.log(mergedResult);
冲突属性处理(同属性多值转为数组)
如果存在同address下属性名相同但值不同的情况,可以把冲突属性转为数组保存所有值:
const mergeByAddressWithConflict = (arr) => { const groupedMap = arr.reduce((acc, current) => { const addressKey = current.address; if (!acc[addressKey]) { acc[addressKey] = {...current}; return acc; } // 遍历当前对象属性,处理冲突 for (const prop in current) { if (acc[addressKey].hasOwnProperty(prop)) { // 已存在的属性,转为数组存储多值 acc[addressKey][prop] = Array.isArray(acc[addressKey][prop]) ? [...acc[addressKey][prop], current[prop]] : [acc[addressKey][prop], current[prop]]; } else { acc[addressKey][prop] = current[prop]; } } return acc; }, {}); return Object.values(groupedMap); };
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

