如何从含字符串与数字的嵌套数组中获取带对应月份的最值
从嵌套混合数组中获取带月份的利润最值
问题场景
现有一个嵌套数组monthsNet,每个元素格式为[月份字符串, 利润数值],需要从中找出利润的最大值和最小值,并且返回包含对应月份的结果,而不是仅返回数字。
示例数组:
let monthsNet = [ [ 'Jan-2010', 116771 ], [ 'Feb-2010', -662642 ], [ 'Mar-2010', -391430 ], [ 'Apr-2010', 379920 ], [ 'May-2010', 212354 ], [ 'Jun-2010', 510239 ], [ 'Jul-2010', -428211 ], [ 'Aug-2010', -821271 ], [ 'Sep-2010', 693918 ], [ 'Oct-2010', 416278 ], [ 'Nov-2010', -974163 ], [ 'Dec-2010', 860159 ], [ 'Jan-2011', -1115009 ], [ 'Feb-2011', 1033048 ], [ 'Mar-2011', 95318 ], [ 'Apr-2011', -308093 ], [ 'May-2011', 99052 ], [ 'Jun-2011', -521393 ], [ 'Jul-2011', 605450 ], [ 'Aug-2011', 231727 ], [ 'Sep-2011', -65187 ], [ 'Oct-2011', -702716 ], [ 'Nov-2011', 177975 ], [ 'Dec-2011', -1065544 ] ]
原代码的局限
之前用于纯数字数组的代码仅能返回单独的数值,无法关联对应的月份:
let max = total[0]; let min = total[0]; for(i=0; i < total.length;i++){ if(total[i] >= max){ max = total[i] } if(total[i] <= min){ min = total[i] } } console.log("Greatest Increase in Profits: $" + max) console.log("Greatest Decrease in Profits: $" + min)
输出结果:
Greatest Increase in Profits: $ 1033048 Greatest Increase in Profits: $ -1115009
期望输出格式:
利润最高增长:Feb-2011 $ 1033048 利润最大降幅:Jan-2011 $ -1115009
解决方案
方案1:修改循环逻辑
核心是跟踪整个嵌套元素,比较时取每个元素的第二个值(利润)进行判断:
// 初始化最值元素为数组第一个元素 let maxItem = monthsNet[0]; let minItem = monthsNet[0]; for (let i = 1; i < monthsNet.length; i++) { // 比较利润值,更新最大利润元素 if (monthsNet[i][1] > maxItem[1]) { maxItem = monthsNet[i]; } // 比较利润值,更新最小利润元素 if (monthsNet[i][1] < minItem[1]) { minItem = monthsNet[i]; } } // 格式化输出结果 console.log(`利润最高增长:${maxItem[0]} $ ${maxItem[1]}`); console.log(`利润最大降幅:${minItem[0]} $ ${minItem[1]}`);
方案2:使用Array.reduce()简化代码
用reduce方法可以更简洁地找出目标元素:
// 筛选出利润最大的元素 const maxItem = monthsNet.reduce((prev, curr) => curr[1] > prev[1] ? curr : prev); // 筛选出利润最小的元素 const minItem = monthsNet.reduce((prev, curr) => curr[1] < prev[1] ? curr : prev); // 输出结果 console.log(`利润最高增长:${maxItem[0]} $ ${maxItem[1]}`); console.log(`利润最大降幅:${minItem[0]} $ ${minItem[1]}`);
两种方案的输出结果均符合预期:
利润最高增长:Feb-2011 $ 1033048 利润最大降幅:Jan-2011 $ -1115009
内容的提问来源于stack exchange,提问作者user20047387
相关产品推荐
相关产品推荐

