如何在JavaScript中按分组获取calculatedFee的最小值?
按Group分组获取最小calculatedFee的JavaScript实现
首先看你的原始数据:
const data = [ { "bankNumber": 1, "calculatedFee": 0, "feeNumber": 4, "group": "1" }, { "bankNumber": 1, "calculatedFee": 147, "feeNumber": 6, "group": "1" }, { "bankNumber": 1, "calculatedFee": 20, "feeNumber": 10, "group": "1" }, { "bankNumber": 2, "calculatedFee": 10, "feeNumber": 10, "group": "3" }, { "bankNumber": 2, "calculatedFee": 100, "feeNumber": 10, "group": "3" }, { "bankNumber": 3, "calculatedFee": 100, "feeNumber": 10, "group": "2" }, ];
下面提供两种简洁的实现方式:
方法一:使用Array.prototype.reduce()
这是处理分组聚合需求的高效方式,一次遍历就能完成分组和最小值计算:
function getMinFeeByGroup(data) { return data.reduce((acc, current) => { const group = current.group; // 若当前分组未记录,或当前费用更小则更新 if (!acc[group] || current.calculatedFee < acc[group]) { acc[group] = current.calculatedFee; } return acc; }, {}); } // 调用并查看结果 const result = getMinFeeByGroup(data); console.log(result); // 输出:{ '1': 0, '3': 10, '2': 100 }
逻辑说明:
- 初始化空对象
acc作为累加器,用于存储每个分组的最小费用 - 遍历数组中的每个对象,取出其
group值 - 对比累加器中该分组的现有值:如果没有记录,直接存入当前费用;如果已有记录,保留更小的那个值
- 遍历结束后,累加器即为最终结果
方法二:使用Map结构
如果更习惯用Map来管理分组,可以用这种方式:
function getMinFeeByGroup(data) { const groupMap = new Map(); for (const item of data) { const group = item.group; if (!groupMap.has(group) || item.calculatedFee < groupMap.get(group)) { groupMap.set(group, item.calculatedFee); } } // 按需转换为普通对象 return Object.fromEntries(groupMap); }
逻辑说明:
- 用
Map存储分组与最小费用的映射 - 遍历数组时更新Map中的分组值,逻辑和reduce方式一致
- 最后通过
Object.fromEntries()将Map转换为普通对象,得到和第一种方法相同的结果
内容的提问来源于stack exchange,提问作者Elder
相关产品推荐
相关产品推荐

