如何在JavaScript中按bankNumber和group筛选最小calculatedFee
按bankNumber和group组合筛选calculatedFee的最小值
我们可以通过遍历数组,以bankNumber-group作为唯一键来分组记录每个组合的最小calculatedFee。下面提供两种实用实现方式:
方式一:返回包含最小费用值的结构化数组
这种方式返回一个简洁的数组,每个元素仅保留bankNumber、group和对应的最小calculatedFee:
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": 1, "calculatedFee": 200, "feeNumber": 10, "group": "2"}, { "bankNumber": 1, "calculatedFee": 20, "feeNumber": 10, "group": "2" }, { "bankNumber": 2, "calculatedFee": 10, "feeNumber": 10, "group": "3" }, { "bankNumber": 2, "calculatedFee": 100, "feeNumber": 10, "group": "3" }, { "bankNumber": 3, "calculatedFee": 100, "feeNumber": 10, "group": "2" }, ]; function getMinFeesByBankGroup(data) { const minFeeMap = {}; data.forEach(item => { const key = `${item.bankNumber}-${item.group}`; // 若键不存在或当前费用更小,则更新记录 if (!minFeeMap.hasOwnProperty(key) || item.calculatedFee < minFeeMap[key]) { minFeeMap[key] = item.calculatedFee; } }); // 将映射转换为结构化数组 return Object.entries(minFeeMap).map(([key, minFee]) => { const [bankNumber, group] = key.split('-'); return { bankNumber: parseInt(bankNumber), group, minCalculatedFee: minFee }; }); } // 使用示例 const result1 = getMinFeesByBankGroup(data); console.log(result1);
输出结果:
[ { bankNumber: 1, group: '1', minCalculatedFee: 0 }, { bankNumber: 1, group: '2', minCalculatedFee: 20 }, { bankNumber: 2, group: '3', minCalculatedFee: 10 }, { bankNumber: 3, group: '2', minCalculatedFee: 100 } ]
方式二:返回包含最小费用的完整对象
如果需要保留原对象的所有属性(如feeNumber),可以直接返回每个组合中费用最小的完整对象:
function getMinFeeObjectsByBankGroup(data) { const minFeeObjectMap = {}; data.forEach(item => { const key = `${item.bankNumber}-${item.group}`; // 若键不存在或当前费用更小,则替换为当前对象 if (!minFeeObjectMap.hasOwnProperty(key) || item.calculatedFee < minFeeObjectMap[key].calculatedFee) { minFeeObjectMap[key] = { ...item }; // 浅拷贝避免引用修改原数据 } }); // 提取映射中的值作为结果数组 return Object.values(minFeeObjectMap); } // 使用示例 const result2 = getMinFeeObjectsByBankGroup(data); console.log(result2);
输出结果:
[ { bankNumber: 1, calculatedFee: 0, feeNumber: 4, group: '1' }, { bankNumber: 1, calculatedFee: 20, feeNumber: 10, group: '2' }, { bankNumber: 2, calculatedFee: 10, feeNumber: 10, group: '3' }, { bankNumber: 3, calculatedFee: 100, feeNumber: 10, group: '2' } ]
核心逻辑说明:
- 用
bankNumber和group拼接唯一键,确保每个组合仅被记录一次 - 遍历数组时,实时对比并更新每个组合的最小费用记录
- 最后将映射转换为数组格式,便于后续业务使用
内容的提问来源于stack exchange,提问作者Elder
相关产品推荐
相关产品推荐

