如何从两个JSON对象中提取指定部门数据并去重?
部门数据提取问题修正
需求说明
需要提取两类部门数据并合并到新数组:
- 仅存在于
departments数组、不存在于dep_logs数组中的部门; dep_logs数组中deleted值为"1"的部门,若同一department_id有多条记录,仅保留creation_date最新的一条。
原代码问题分析
原代码存在以下几个错误:
finalMapDeletedDepartment被声明为数组[],但调用了Map的has/get/set方法,类型不匹配;dep_logs中的deleted字段是字符串类型(如"1"),但判断条件用了item.deleted === 1,类型不相等导致逻辑失效;- 遍历
departments时,错误使用item.id判断,实际部门ID的键是department_id; - 未将筛选出的deleted部门合并到最终结果数组
finalList中。
修正后的代码
var departments = [{ "department_id": "1", "name": "sales" }, { "department_id": "2", "name": "marketing" }, { "department_id": "3", "name": "operation" }]; var dep_logs = [{ "department_id": "2", "creation_date": "2023-05-22 15:47:58", "created_by": "1", "deleted": "0" }, { "department_id": "2", "creation_date": "2023-05-22 15:46:56", "created_by": "1", "deleted": "1" }, { "department_id": "3", "creation_date": "2023-05-13 17:59:27", "created_by": "1", "deleted": "0" }, { "department_id": "2", "creation_date": "2023-05-13 17:59:11", "created_by": "1", "deleted": "1" }, { "department_id": "1", "creation_date": "2023-05-13 09:46:25", "created_by": "1", "deleted": "0" }]; var finalList = []; // 改用Map存储已筛选的deleted部门,key为department_id var finalMapDeletedDepartment = new Map(); var idSet = new Set(); // 第一步:处理dep_logs,收集所有出现过的department_id,并筛选deleted=1的最新记录 dep_logs.forEach(item => { idSet.add(item.department_id); // 注意deleted是字符串类型,判断值为"1" if (item.deleted === "1") { if (finalMapDeletedDepartment.has(item.department_id)) { const existingItem = finalMapDeletedDepartment.get(item.department_id); // ISO格式日期字符串可直接比较大小 if (existingItem.creation_date < item.creation_date) { finalMapDeletedDepartment.set(item.department_id, item); } } else { finalMapDeletedDepartment.set(item.department_id, item); } } }); // 第二步:添加仅存在于departments的部门 departments.forEach(item => { // 使用正确的键department_id if (!idSet.has(item.department_id)) { finalList.push(item); } }); // 第三步:将筛选出的deleted部门合并到最终数组 finalList.push(...finalMapDeletedDepartment.values()); console.log("最终结果数组:", finalList);
代码逻辑说明
- 收集日志中的部门ID:用
Set存储dep_logs里出现过的department_id,实现O(1)时间复杂度的存在性判断; - 筛选deleted=1的最新记录:用
Map以department_id为键存储记录,遍历过程中若遇到同ID记录,通过日期字符串比较保留最新条目; - 补充仅存在于departments的部门:遍历
departments,将未出现在日志中的部门加入结果数组; - 合并两类结果:将
Map中存储的deleted部门转换为数组,合并到最终结果中。
内容的提问来源于stack exchange,提问作者kelyen
相关产品推荐
相关产品推荐

