
该函数用于从二维数组中提取每个子数组的最大值,但当前实现会因跳过空子数组而导致结果数组中出现 undefined 占位符(即 ),需改用 push() 动态追加结果并优化内层循环起点。
该函数用于从二维数组中提取每个子数组的最大值,但当前实现会因跳过空子数组而导致结果数组中出现 `undefined` 占位符(即 ``),需改用 `push()` 动态追加结果并优化内层循环起点。
在 JavaScript 中处理嵌套数组(如 [[ ], [1, 2], [ ]])并提取每组最大值时,一个常见陷阱是直接按索引赋值导致稀疏数组。原代码使用 k[i] = ans; 将结果写入 k 数组的第 i 位,但当遇到空子数组(如 arrayOfArrays[i].length === 0)时执行 continue,跳过了该索引——这并不会删除该位置,而是留下一个 empty item(即 k[i] 为 undefined),最终返回类似 [empty, 2, empty] 的稀疏数组,其 JSON 序列化或遍历时会表现为 。
✅ 正确做法是:始终使用 k.push(ans),确保结果数组紧凑、索引连续。同时可进一步优化性能:内层循环无需从 j = 0 开始,因为 ans 已初始化为首个元素 arrayOfArrays[i][0],故 j 可从 1 起始。
以下是修复后的标准实现:
function findLargestNumbers(arrayOfArrays) {
const result = []; // 推荐使用字面量语法,更清晰
for (let i = 0; i <p>? <strong>进阶建议:函数式写法(兼顾可读性与性能)</strong> </p>
- ✅ 最易读(推荐初学者):
arr.filter(sub => sub.length > 0).map(sub => Math.max(...sub));
- ⚡ 最高性能(大数据量场景):
arr.reduce((acc, sub) => { if (sub.length > 0) { let max = sub[0]; for (let i = 1; i max) max = sub[i]; } acc.push(max); } return acc; }, []);
⚠️ 注意事项:
- 避免
new Array(易与Array(n)误用混淆),统一用[]; -
Math.max(...arr)对超大数组可能触发栈溢出(>10⁵ 元素),此时必须用循环; - 若需兼容空子数组输出
null或-Infinity,应显式处理而非continue。
总结:“跳过就用 push,别碰索引赋值” 是解决此类稀疏数组问题的核心原则。










