如何使用reduce方法从二维数组中提取每类元素对应的最大数值
实现方案说明
你原有代码的核心问题
- 混淆了当前遍历元素
b和原数组arr的概念:b[i+1][0]写法错误,b是当前正在遍历的二维数组子项,不是原数组本身,要取下一个元素应该访问arr[i+1] - 累加器使用逻辑错误:不需要依赖相邻元素对比,直接通过累加器记录已遍历币种的最大值即可,且你返回的数组结构会被展开为一维,不符合预期的二维数组要求
- 逻辑通用性差:你的写法依赖同面值的数组元素相邻排列,如果后续同面值元素分散在数组中就会失效
正确实现思路
reduce的累加器核心作用是存储遍历过程中已经产生的结果,我们可以直接用它记录每个币种对应的当前最大值,不需要额外对比相邻元素:
- 遍历每个子数组时,先取出当前的币种名称和对应数值
- 检查累加器中是否已经存在该币种的记录
- 不存在则直接添加当前记录,存在则更新该币种的数值为两者中的最大值
- 遍历结束后直接得到目标结果
实现1:用对象作为累加器(效率更高)
对象的键查找时间复杂度为O(1),适合数据量较大的场景,最后转换为二维数组即可:
const result = Object.entries( tempCollected.reduce((acc, curr) => { const [currency, value] = curr; // 已有该币种则取最大值,没有则直接赋值 acc[currency] = acc[currency] ? Math.max(acc[currency], value) : value; return acc; }, {}) );
实现2:直接用数组作为累加器(无需二次转换)
如果不想做后续格式转换,直接用数组作为累加器也可以,每次查找累加器中是否存在对应币种即可:
const result = tempCollected.reduce((acc, curr) => { const [currency, value] = curr; // 查找累加器中已有的同币种记录 const existRecord = acc.find(item => item[0] === currency); if (existRecord) { existRecord[1] = Math.max(existRecord[1], value); } else { acc.push([currency, value]); } return acc; }, []);
两种实现的输出都和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Igor Lee
相关产品推荐
相关产品推荐

