如何用JavaScript合并具有相同键值的JSON对象并整合字段
合并具有相同name键值的JSON对象
针对你的需求,我们可以通过分组+字段合并的方式实现,以下是具体的JavaScript代码实现,适合初学者理解:
实现代码
const originalData = { "data": [ { "name": "A", "description": { "location": "location1", "floor": "floor1", }, }, { "name": "A", "description": { "location": "location2", "floor": "floor1", }, }, { "name": "B", "description": { "location": "location3", "floor": "floor3", }, }, ] }; // 1. 创建临时对象,按name字段分组存储数据 const groupedItems = {}; // 2. 遍历原始数据,逐个处理每个对象 originalData.data.forEach(item => { const { name, description } = item; // 如果当前name还没被分组,初始化一个新对象 if (!groupedItems[name]) { groupedItems[name] = { name, // 浅拷贝原description,避免修改原数据 description: { ...description } }; return; } // 3. 合并description中的字段 const existingDesc = groupedItems[name].description; Object.keys(description).forEach(key => { const currentVal = description[key]; const existingVal = existingDesc[key]; // 如果两个值不同,需要合并成数组 if (existingVal !== currentVal) { // 先把已有值转成数组(如果还不是数组的话) if (!Array.isArray(existingVal)) { existingDesc[key] = [existingVal]; } // 添加新值到数组 existingDesc[key].push(currentVal); } // 值相同则直接保留,无需操作 }); }); // 4. 把分组对象转成数组,得到最终结果 const mergedResult = { data: Object.values(groupedItems) }; // 打印结果验证 console.log(JSON.stringify(mergedResult, null, 2));
代码说明
- 分组逻辑:用
groupedItems对象以name为键存储分组后的对象,确保相同name的对象只会被初始化一次。 - 字段合并:遍历
description的每个字段,对比已有值和当前值:- 值相同:直接保留原数值
- 值不同:将已有值转为数组,再追加新值
- 结果转换:通过
Object.values(groupedItems)把分组对象的所有值提取成数组,匹配你需要的输出结构。
注意事项
- 代码中用了浅拷贝(
{ ...description }),如果你的description里有嵌套的复杂对象,需要改用深拷贝(比如JSON.parse(JSON.stringify(description)))来避免意外修改原数据。 - 这个逻辑支持
description中多个字段的合并,不止局限于location字段。
内容的提问来源于stack exchange,提问作者stevart
相关产品推荐
相关产品推荐

