JS嵌套数组取各子数组最大值函数处理负数异常问题排查
问题原因分析
- 最大值比较变量
nw初始化逻辑错误:nw被定义在外层循环之外,且初始值硬编码为0。当遍历的子数组所有元素均为负数时,没有元素满足w[rr] > nw的判断条件,nw会保持初始值0,导致全负数子数组的最大值计算错误。 - 最大值变量未按子数组重置:每处理完一个子数组后,没有重置
nw的值,前一个子数组的最大值会保留,污染后续子数组的计算逻辑,若后续子数组的最大值小于前一个子数组的最大值,也会出现结果错误。
修复方案
将nw变量的声明与初始化移动到外层循环内部,每次处理新的子数组时,将nw初始化为极小值-Infinity,保证任何数字都能大于初始值,不会出现比较失效的问题。
修复后代码:
function longestfour(arr) { let w; let newArr = []; for (let r in arr) { let nw = -Infinity; // 每次处理新子数组前重置最大值初始值 w = arr[r]; for (let rr in w) { if (w[rr] > nw) { nw = w[rr]; } } newArr.push(nw); } return newArr; } console.log(longestfour([ [-334, -6, -243, -87], [7, 65, 46, 3], [8, 55, 76, 2] ])); // 输出 [-6, 65, 76] 符合预期
可选简化写法,直接使用JS内置方法避免手动循环的逻辑漏洞:
function longestfour(arr) { return arr.map(subArr => Math.max(...subArr)) }
内容的提问来源于stack exchange,提问作者Abdulhameed Sabur
相关产品推荐
相关产品推荐

