
本文介绍如何在 javascript 中对对象数组按指定字段(如 group)分组,并为每组快速提取 calculatedfee 的最小值,提供原生循环与 reduce 两种实用方案。
在实际开发中,常需从结构化数据中按分类维度聚合统计信息,例如“每组中费用最低的记录”。给定一个包含 group 和 calculatedFee 字段的对象数组,目标是:为每个唯一 group 值,找出其对应对象中 calculatedFee 的最小值。
最直观且性能优良的方式是使用单次遍历 + 哈希表(Plain Object 或 Map)缓存各组当前最小值:
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" }
];
const minFeesByGroup = {};
for (const item of data) {
const current = item.calculatedFee;
const existing = minFeesByGroup[item.group] ?? Infinity;
if (current < existing) {
minFeesByGroup[item.group] = current;
}
}
console.log(minFeesByGroup);
// { "1": 0, "3": 10, "2": 100 }该方法时间复杂度为 O(n),空间复杂度为 O(k)(k 为不同 group 数量),无额外依赖,兼容所有现代浏览器及 Node.js 环境。
若偏好函数式风格,也可用 Array.prototype.reduce 实现等效逻辑:
立即学习“Java免费学习笔记(深入)”;
const minFeesByGroup = data.reduce((acc, item) => {
const { group, calculatedFee } = item;
acc[group] = Math.min(acc[group] ?? Infinity, calculatedFee);
return acc;
}, {});⚠️ 注意事项:
- 若需返回完整对象(而非仅最小值),应缓存整个对象(如 acc[group] = current
- group 值为 undefined 或空字符串时可能引发意外覆盖,建议提前校验;
- 如 group 类型多样(含数字、null、对象),推荐使用 Map 替代普通对象以避免原型污染或类型隐式转换问题。
总结:单次循环 + 条件更新是最清晰、高效且易维护的解法;掌握此模式,可轻松扩展至求最大值、平均值、计数等其他分组聚合场景。










