如何创建包含唯一分组最大元素的键数组?
我来帮你搞定这个问题!你需要的是按typeid分组并提取每组的最大值,单纯用map和lodash的uniq确实达不到目的——这俩工具没法帮你对比数值大小并保留每组的最大值,得先完成分组,再针对每组做最大值提取,下面给你两种实用的方案:
原生JavaScript方案(无需额外库)
这个方案完全用原生JS实现,步骤清晰:
- 遍历原数组,把每个元素拆分成
typeid和对应的数值(注意要把字符串转成数字,避免字符串比较的坑) - 用一个临时对象记录每个
typeid的当前最大值,遍历过程中不断对比更新 - 最后把对象的键值对转换成你需要的字符串格式数组
// 假设你的原始输入数组是这样的 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,可以利用它的分组和数组处理工具来简化代码:
- 用
_.groupBy按typeid对原数组分组 - 用
_.mapValues遍历每个分组,提取出该组的最大值 - 最后同样转换成目标格式数组
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
相关产品推荐
相关产品推荐

