You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从两个JSON对象中提取指定部门数据并去重?

部门数据提取问题修正

需求说明

需要提取两类部门数据并合并到新数组:

  • 仅存在于departments数组、不存在于dep_logs数组中的部门;
  • dep_logs数组中deleted值为"1"的部门,若同一department_id有多条记录,仅保留creation_date最新的一条。

原代码问题分析

原代码存在以下几个错误:

  1. finalMapDeletedDepartment被声明为数组[],但调用了Map的has/get/set方法,类型不匹配;
  2. dep_logs中的deleted字段是字符串类型(如"1"),但判断条件用了item.deleted === 1,类型不相等导致逻辑失效;
  3. 遍历departments时,错误使用item.id判断,实际部门ID的键是department_id;
  4. 未将筛选出的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);

代码逻辑说明

  1. 收集日志中的部门ID:用Set存储dep_logs里出现过的department_id,实现O(1)时间复杂度的存在性判断;
  2. 筛选deleted=1的最新记录:用Map以department_id为键存储记录,遍历过程中若遇到同ID记录,通过日期字符串比较保留最新条目;
  3. 补充仅存在于departments的部门:遍历departments,将未出现在日志中的部门加入结果数组;
  4. 合并两类结果:将Map中存储的deleted部门转换为数组,合并到最终结果中。

内容的提问来源于stack exchange,提问作者kelyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:02:44