如何按ID匹配两个数组并统计各ID对应的状态计数?
解决数组匹配并统计状态计数的问题
你当前代码的问题在于嵌套map时,每次匹配到ID就生成新对象推入数组,导致同一个ID的不同状态分散在多个独立对象中,无法聚合到原数组元素的count字段里。下面是可行的解决方案:
实现步骤
- 先遍历数组
b,统计每个ID对应的各status出现次数 - 再遍历数组
a,将统计好的计数结果合并到对应元素中
完整代码
const a = [ { id: 1, name: "Mark" }, { id: 2, name: "John" }, { id: 3, name: "Ruth" } ]; const b = [ { assigned: [1], status: "C" }, { assigned: [1, 2], status: "S" }, { assigned: [2], status: "O" }, { assigned: [2, 3], status: "C" } ]; // 第一步:统计每个ID的状态出现次数 const idStatusCounts = {}; b.forEach(item => { const { assigned, status } = item; assigned.forEach(id => { // 初始化当前ID的统计对象 if (!idStatusCounts[id]) { idStatusCounts[id] = {}; } // 更新对应状态的计数,不存在则设为1,存在则+1 idStatusCounts[id][status] = (idStatusCounts[id][status] || 0) + 1; }); }); // 第二步:合并统计结果到数组a const result = a.map(user => ({ ...user, count: idStatusCounts[user.id] || {} })); console.log(result);
代码说明
- 第一部分遍历数组
b,把每个assigned数组中的ID对应的status都聚合到idStatusCounts对象中,确保同一个ID的所有状态次数都被集中统计。 - 第二部分遍历数组
a,直接将对应ID的统计结果作为count字段添加到原元素上,没有匹配到状态的ID会自动使用空对象作为count值。
执行后得到的result结构与你预期的完全一致。
内容的提问来源于stack exchange,提问作者shenoy
相关产品推荐
相关产品推荐

