对象与数组重复值统计错误分析及正确实现方案
问题分析与修复方案
让我帮你拆解下代码里的问题,然后给出符合预期的实现:
首先,你的代码核心问题有两个:
- 嵌套的
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);
代码说明
codeLookup映射:把arrayList里的元素用code作为key存起来,后续查找某个code是否合法时,不用再遍历整个数组,既高效又避免逻辑混乱。countTracker+firstAppearanceOrder:前者负责统计每个code的出现次数,后者记录code在userChoose中首次出现的顺序,完美匹配你对结果顺序的要求。- 结果生成:按照
firstAppearanceOrder的顺序,把每个code对应的计数组装成你需要的对象结构,直接得到预期输出。
运行这段代码后,输出就是你想要的:
[ { "id": 900, "count": 2 }, { "id": 101, "count": 11 } ]
内容的提问来源于stack exchange,提问作者poppop
相关产品推荐
相关产品推荐

