如何比较并操作JSON对象:按规则合并data1与data2数组数据
解决方案:合并并转换JSON对象数据
实现思路
- 提取
data1.details中已有的comp_id,用Set存储以快速判断匹配情况 - 遍历
data2,筛选出未匹配的项,将其结构转换为data1.details的格式 - 合并原
details数组和转换后的新项,重命名字段为declaration_details,同时保留data1的其他原有字段
代码实现
// 原始数据 let data1 = { "id": "111", "entity_id": "222", "text_id": "333", "details": [{ "value": 1000, "comp_id": "444", "CompName": "driving" }] }; let data2 = [{ "id": "111", "text_id": "333", "criteria_type": "TXT", "value": 1000, "comp": { "id": "444", "name": "driving" } }, { "id": "222", "text_id": "444", "criteria_type": "TXT", "value": 2000, "comp": { "id": "555", "name": "swiming" } }]; // 1. 提取已有的comp_id集合 const existingCompIds = new Set(data1.details.map(item => item.comp_id)); // 2. 筛选data2中未匹配的项并转换格式 const newItems = data2.filter(item => !existingCompIds.has(item.comp.id)) .map(item => ({ value: item.value, comp_id: item.comp.id, CompName: item.comp.name })); // 3. 合并数组并构造结果对象 const result = { ...data1, declaration_details: [...data1.details, ...newItems] }; // 删除原details字段 delete result.details; console.log(JSON.stringify(result, null, 2));
代码解释
- 提取已有ID集合:用
Set存储data1.details里的comp_id,判断是否存在的时间复杂度为O(1),比数组遍历更高效 - 筛选并转换新项:用
filter找出data2中不在已有集合里的项,再用map把结构转换成和data1.details一致的格式 - 构造结果对象:用扩展运算符
...复制data1的原有字段,添加合并后的declaration_details数组,最后删除原来的details字段
运行代码后会输出符合需求的目标JSON对象。
内容的提问来源于stack exchange,提问作者wiilan
相关产品推荐
相关产品推荐

