You need to enable JavaScript to run this app. 如何使用reduce方法从二维数组中提取每类元素对应的最大数值
优惠活动
大模型
产品
解决方案
定价
更多

如何使用reduce方法从二维数组中提取每类元素对应的最大数值

实现方案说明

你原有代码的核心问题

  • 混淆了当前遍历元素b和原数组arr的概念:b[i+1][0]写法错误,b是当前正在遍历的二维数组子项,不是原数组本身,要取下一个元素应该访问arr[i+1]
  • 累加器使用逻辑错误:不需要依赖相邻元素对比,直接通过累加器记录已遍历币种的最大值即可,且你返回的数组结构会被展开为一维,不符合预期的二维数组要求
  • 逻辑通用性差:你的写法依赖同面值的数组元素相邻排列,如果后续同面值元素分散在数组中就会失效

正确实现思路

reduce的累加器核心作用是存储遍历过程中已经产生的结果,我们可以直接用它记录每个币种对应的当前最大值,不需要额外对比相邻元素:

  1. 遍历每个子数组时,先取出当前的币种名称和对应数值
  2. 检查累加器中是否已经存在该币种的记录
  3. 不存在则直接添加当前记录,存在则更新该币种的数值为两者中的最大值
  4. 遍历结束后直接得到目标结果

实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 20:57:04