JavaScript遍历嵌套数组:for循环仅执行一次的问题排查
问题排查与修复
嘿,我来帮你揪出代码里的问题,其实有好几处小细节出错了,导致循环要么提前终止要么执行次数不对:
1. allTop类型错误(直接导致循环终止)
你把allTop初始化成了字符串"",但push()是数组专属方法,字符串根本没有这个方法——运行到allTop.push(top[0])时会直接抛出错误,循环直接停在这里,自然看起来只执行了一次。
正确的初始化应该是空数组:
var allTop = [];
2. 循环中重复递增i
你的for循环已经自带了i++的递增逻辑,结果在循环体里又手动加了一次i++;。这会导致每次循环i直接增加2,原本数组有4个子数组,循环只会执行2次(i从0→2→4,触发退出条件),更别说前面的错误让循环直接死在第一次了。
必须删掉循环体里的i++;,让for循环自己处理递增逻辑。
3. 额外问题:sort会修改原数组(非致命但不推荐)
arr[i].sort(...)是原地排序,会直接修改你传入的原数组里的子数组顺序。如果不想破坏原输入,最好先复制子数组再排序:
var top = arr[i].slice().sort(function(a, b) { return b - a; });
4. 函数缺少返回值
就算前面的问题都修复了,你的函数最后没有return allTop,调用后也拿不到任何结果。
修复后的完整代码
function largestOfFour(arr) { var allTop = []; // 初始化为空数组 for (var i = 0; i < arr.length; i++) { // 复制子数组后排序,避免修改原数组 var sortedSubArr = arr[i].slice().sort(function(a, b) { return b - a; }); allTop.push(sortedSubArr[0]); // 移除多余的i++ } return allTop; // 返回结果数组 } // 测试调用 console.log(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])); // 输出: [5, 27, 39, 1001]
更高效的优化方案
其实找最大值根本不需要排序,用Math.max可以直接拿到结果,效率更高:
function largestOfFour(arr) { var allTop = []; for (var i = 0; i < arr.length; i++) { // 直接获取子数组的最大值 var maxVal = Math.max.apply(null, arr[i]); allTop.push(maxVal); } return allTop; }
内容的提问来源于stack exchange,提问作者chauxvive




