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

对象与数组重复值统计错误分析及正确实现方案

问题分析与修复方案

让我帮你拆解下代码里的问题,然后给出符合预期的实现:

首先,你的代码核心问题有两个:

  • 嵌套的forEach逻辑混乱:每处理一个userChoose里的元素,你都把arrayList完整遍历一遍,这会导致同一个数值被重复统计多次,而且创建newEntry时,你错误地用了当前循环到的point.code,而不是和ar匹配的那个code,直接导致id和实际要统计的数值完全不对应。
  • 没正确处理结果的顺序:你期望结果按照userChoose中数值首次出现的顺序排列,但原代码的逻辑根本没实现这一点。

修正后的代码

const arrayList = [{ "code": 101, "name": "banana", "price": 1000 }, { "code": 4, "name": "bluebberries", "price": 3000 }, { "code": 900, "name": "apple", "price": 300 }];
const userChoose = [900, 900, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101];

// 先建立code到arrayList元素的映射,避免重复遍历数组
const codeLookup = new Map();
arrayList.forEach(item => {
  codeLookup.set(item.code, item);
});

// 统计次数 + 记录首次出现的顺序
const countTracker = new Map();
const firstAppearanceOrder = [];

userChoose.forEach(code => {
  // 可选:如果要只统计arrayList中存在的code,加上这个判断
  if (!codeLookup.has(code)) return;

  if (countTracker.has(code)) {
    countTracker.set(code, countTracker.get(code) + 1);
  } else {
    countTracker.set(code, 1);
    firstAppearanceOrder.push(code); // 记录首次出现的顺序
  }
});

// 生成最终结果数组
const result = firstAppearanceOrder.map(code => ({
  id: code,
  count: countTracker.get(code)
}));

console.log(result);

代码说明

  1. codeLookup映射:把arrayList里的元素用code作为key存起来,后续查找某个code是否合法时,不用再遍历整个数组,既高效又避免逻辑混乱。
  2. countTracker + firstAppearanceOrder:前者负责统计每个code的出现次数,后者记录code在userChoose中首次出现的顺序,完美匹配你对结果顺序的要求。
  3. 结果生成:按照firstAppearanceOrder的顺序,把每个code对应的计数组装成你需要的对象结构,直接得到预期输出。

运行这段代码后,输出就是你想要的:

[ { "id": 900, "count": 2 }, { "id": 101, "count": 11 } ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:09:06