如何在Mule中依据对象公共字段合并数组内的字段值
对象数组按公共字段合并指定字段
需求说明
给定对象数组,需依据对象的公共字段值合并address1、mobile、nickName字段,规则如下:
mobile合并为数组,重复值仅保留一次address1与nickName拼接为逗号分隔的字符串- 若
active字段值不同,对象不参与合并
输入示例
[ { "address1": "Koala Boulevard-314", "city": "San Diego", "country": "USA", "mobile": ["12345","45678"], "name": "Michael", "nickName": "Mike", "postalCode": "1345", "stateOrProvince": "CA", "active": "false", "dob": "1996-05-01" }, { "address1": "Park Avenue-879", "city": "San Diego", "country": "USA", "mobile": ["65789","45678"], "name": "Michael", "nickName": "Mic", "postalCode": "1345", "stateOrProvince": "CA", "active": "false", "dob": "1996-05-01" }, { "address1": "Koala Boulevard-314", "city": "San Diego", "country": "USA", "mobile": ["89065","67895"], "name": "Michael", "nickName": "Mike", "postalCode": "1345", "stateOrProvince": "CA", "active": "false", "dob": "1996-05-01" }, { "address1": "Koala Boulevard-314", "city": "San Diego", "country": "USA", "mobile": ["36926","85931"], "name": "Michael", "nickName": "Mike", "postalCode": "1345", "stateOrProvince": "CA", "active": "false", "dob": "1996-05-01" } ]
期望输出
[ { "address1": "Koala Boulevard-314,Park Avenue-879", "city": "San Diego", "country": "USA", "mobile": ["12345","45678","65789"], "name": "Michael", "nickName": "Mike,Mic", "postalCode": "1345", "stateOrProvince": "CA", "active": "false", "dob": "1996-05-01" }, { "address1": "Koala Boulevard-314", "city": "San Diego", "country": "USA", "mobile": ["89065","67895"], "name": "Michael", "nickName": "Mike", "postalCode": "1345", "stateOrProvince": "CA", "active": "true", "dob": "1996-05-01" }, { "address1": "Koala Boulevard-314", "city": "San Diego", "country": "USA", "mobile": ["36926","85931"], "name": "Michael", "nickName": "Mike", "postalCode": "1345", "stateOrProvince": "CA", "active": "false", "dob": "1996-05-01" } ]
实现方案(JavaScript)
function mergeObjects(arr) { const groupMap = new Map(); arr.forEach(obj => { // 生成分组标识:包含所有公共字段,确保active不同的对象不合并 const key = [obj.name, obj.city, obj.country, obj.postalCode, obj.stateOrProvince, obj.active, obj.dob].join('-'); if (!groupMap.has(key)) { groupMap.set(key, { ...obj, address1: new Set([obj.address1]), mobile: new Set(obj.mobile), nickName: new Set([obj.nickName]) }); } else { const existing = groupMap.get(key); existing.address1.add(obj.address1); obj.mobile.forEach(num => existing.mobile.add(num)); existing.nickName.add(obj.nickName); } }); // 转换Set为目标格式 return Array.from(groupMap.values()).map(item => ({ ...item, address1: Array.from(item.address1).join(','), mobile: Array.from(item.mobile), nickName: Array.from(item.nickName).join(',') })); } // 测试调用 const input = [/* 输入示例中的数组 */]; console.log(JSON.stringify(mergeObjects(input), null, 2));
代码说明
- 分组逻辑:通过公共字段(含
active)拼接成唯一key,用Map存储分组,确保active不同的对象不会被合并 - 去重处理:用
Set存储address1、mobile、nickName,自动实现去重 - 格式转换:最后将
Set转换为逗号分隔字符串或数组,匹配期望输出格式
内容的提问来源于stack exchange,提问作者Uday
相关产品推荐
相关产品推荐

