Angular中按父ID分组计算子数组test_per_day最小值的实现问题
解决Angular中计算每个ID对应最小test_per_day的问题
嘿,我来帮你搞定这个计算最小值的问题!你之前的代码只是把所有test_per_day都塞进数组里,但没针对每个ID单独处理最小值,这就导致没法把ID和对应的最小值关联起来。咱们换个更清晰的方式来实现:
核心思路
我们可以用Array.map()遍历原始数据的每个对象,对每个对象的areas数组提取所有test_per_day值,再计算出最小值,最后把ID和最小值组合成新对象存入结果数组。
完整实现代码
// 假设你的原始数据存在this.myData中 const minTestResults = this.myData.map(item => { // 提取当前ID下所有areas的test_per_day数值 const dailyTestValues = item.areas.map(area => area.test_per_day); // 计算最小值,同时处理areas为空的边界情况 const minDailyTest = dailyTestValues.length > 0 ? Math.min(...dailyTestValues) : 0; // 这里可以换成你需要的默认值,比如null或者Infinity return { id: item.id, min_test_per_day: minDailyTest }; }); // 打印结果看看 console.log(minTestResults);
运行这段代码后,你会得到这样的结果数组:
[ { id: 'N5604-E', min_test_per_day: 22 }, { id: 'RSP4-E', min_test_per_day: 12 } ]
另一种用reduce的实现方式(适合更复杂的场景)
如果你担心Math.min(...array)在数组过大时的性能问题,或者想更灵活地处理最小值计算,可以用Array.reduce():
const minTestResults = this.myData.map(item => { const minDailyTest = item.areas.reduce((currentMin, area) => { return area.test_per_day < currentMin ? area.test_per_day : currentMin; }, Infinity); // 初始值设为Infinity,确保第一个数值能替换它 // 同样处理空数组的情况 const finalMin = item.areas.length === 0 ? 0 : minDailyTest; return { id: item.id, min_test_per_day: finalMin }; });
为什么之前的代码没达到效果?
你之前的循环只是把所有ID和所有test_per_day分别存入两个数组,但没有建立ID和对应最小值的关联,也没做最小值的计算逻辑。现在的方法通过map直接把每个ID和它对应的最小值绑定成对象,逻辑更清晰,结果也完全符合需求。
内容的提问来源于stack exchange,提问作者gvpeela
相关产品推荐
相关产品推荐

