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

JS获取二维数组各分组最大值 代码漏取最后一项排错

问题说明

现有如下二维数组,需要按首元素分类,仅保留每个分类对应数值最大的条目:

const myArray = [["Cow", 3], ["Pig", 5], ["Pig", 10], ["Pig", 4], ["Chicken", 1], ["Cow", 1], ["Cow" , 12], ["Cow", 11], ["Chicken", 12]]

目标输出结果:

[ [ 'Pig', 10 ], [ 'Cow', 12 ], [ 'Chicken', 12 ] ]

使用如下代码运行后,始终缺失最后一个分类(Chicken)的最大值条目,实际输出为[ [ 'Pig', 10 ], [ 'Cow', 12 ] ]:

const myArray = [["Cow", 3], ["Pig", 5], ["Pig", 10], ["Pig", 4], ["Chicken", 1], ["Cow", 1], ["Cow" , 12], ["Cow", 11], ["Chicken", 12]]

function getHighest() {

  var onlyHighest = [];

  myArray.sort(
    function(a,b) {
      if (a[0] == b[0])
       return a[1] < b[1] ? -1 : 1;
      return a[0] < b[0] ? 1 : -1;
    }
  );  

  myArray.forEach((a, i) => {
    var i = i+1;
    if (i < myArray.length) {
      if (a[0] != myArray[i][0]){
        onlyHighest.push([a[0], a[1]]);
      }
    }
  });

  return console.log(onlyHighest)
}
问题根因

你的实现逻辑是先对数组排序:同分类下按数值升序排列,不同分类按分类名降序排列,之后遍历数组,只要当前元素和下一个元素的分类名不一致,就说明当前元素是当前分类的最大值,推入结果数组。
但遍历逻辑里加了if (i < myArray.length)的判断:当遍历到数组最后一个元素时,i+1刚好等于数组长度,这个元素会被直接跳过,而排序后数组的最后一个元素恰好是最后一个分类的最大值,所以永远不会被推入结果数组。

修复方法

只需要在遍历结束后,额外把排序后数组的最后一个元素推入结果数组即可。因为同分类按升序排列时,每个分类排在最后的元素就是该分类的最大值,最后一个分类的最大值必然是整个数组的最后一位。
修复后的完整代码:

const myArray = [["Cow", 3], ["Pig", 5], ["Pig", 10], ["Pig", 4], ["Chicken", 1], ["Cow", 1], ["Cow" , 12], ["Cow", 11], ["Chicken", 12]]

function getHighest() {

  var onlyHighest = [];

  myArray.sort(
    function(a,b) {
      if (a[0] == b[0])
       return a[1] < b[1] ? -1 : 1;
      return a[0] < b[0] ? 1 : -1;
    }
  );  

  myArray.forEach((a, i) => {
    const nextIndex = i+1;
    if (nextIndex < myArray.length) {
      if (a[0] != myArray[nextIndex][0]){
        onlyHighest.push([a[0], a[1]]);
      }
    }
  });
  // 补入最后一个分类的最大值
  onlyHighest.push(myArray.at(-1))

  return console.log(onlyHighest)
}

getHighest() // 输出 [ [ 'Pig', 10 ], [ 'Cow', 12 ], [ 'Chicken', 12 ] ]

*补充:也可以用reduce实现更简洁的分组取最大值逻辑,不需要排序,时间复杂度更低:

const res = Object.values(myArray.reduce((acc, [category, num]) => {
  if (!acc[category] || acc[category][1] < num) {
    acc[category] = [category, num]
  }
  return acc
}, {}))
console.log(res)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:31:36