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

如何创建包含唯一分组最大元素的键数组?

我来帮你搞定这个问题!你需要的是按typeid分组并提取每组的最大值,单纯用map和lodash的uniq确实达不到目的——这俩工具没法帮你对比数值大小并保留每组的最大值,得先完成分组,再针对每组做最大值提取,下面给你两种实用的方案:

原生JavaScript方案(无需额外库)

这个方案完全用原生JS实现,步骤清晰:

  1. 遍历原数组,把每个元素拆分成typeid和对应的数值(注意要把字符串转成数字,避免字符串比较的坑)
  2. 用一个临时对象记录每个typeid的当前最大值,遍历过程中不断对比更新
  3. 最后把对象的键值对转换成你需要的字符串格式数组
// 假设你的原始输入数组是这样的
const originalArray = [
  "abcdwidets:1234",
  "nightly:5678",
  "abcdwidets:6564",
  "nightly:6543",
  "abcdwidets:4321"
];

// 第一步:分组并记录每组最大值
const maxValueMap = {};
originalArray.forEach(item => {
  const [typeId, valueStr] = item.split(':');
  const value = Number(valueStr);
  // 如果该typeid未记录,或者当前值比已记录的最大值更大,就更新
  if (!maxValueMap[typeId] || value > maxValueMap[typeId]) {
    maxValueMap[typeId] = value;
  }
});

// 第二步:转换成目标格式的数组
const result = Object.entries(maxValueMap).map(([typeId, value]) => `${typeId}:${value}`);

console.log(result); // 输出:["abcdwidets:6564", "nightly:6543"]

Lodash方案(更简洁的写法)

如果你习惯用Lodash,可以利用它的分组和数组处理工具来简化代码:

  1. 用_.groupBy按typeid对原数组分组
  2. 用_.mapValues遍历每个分组,提取出该组的最大值
  3. 最后同样转换成目标格式数组
const _ = require('lodash');

const originalArray = [
  "abcdwidets:1234",
  "nightly:5678",
  "abcdwidets:6564",
  "nightly:6543",
  "abcdwidets:4321"
];

// 按typeid分组
const groupedItems = _.groupBy(originalArray, item => item.split(':')[0]);

// 提取每组的最大值
const maxValueMap = _.mapValues(groupedItems, items => {
  // 把每组的数值转成数字后取最大值
  return _.max(items.map(item => Number(item.split(':')[1])));
});

// 转换成目标数组
const result = Object.entries(maxValueMap).map(([typeId, value]) => `${typeId}:${value}`);

console.log(result); // 输出:["abcdwidets:6564", "nightly:6543"]

为什么之前的map+uniq不行?

uniq只能帮你去除数组中的重复项,但它没法识别typeid分组,也没法对比数值大小来保留最大值——你需要的是**分组+聚合(取最大值)**的组合操作,这才是解决问题的核心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:51:58