JS嵌套for循环实现两数之和返回空数组的问题排查
问题原因
- 核心错误是数组判空逻辑完全错误:JavaScript中数组是引用类型,
arrResults !== []永远返回true——因为等号两边是两个不同内存地址的数组对象,不管arrResults是不是空,这个判断都不会成立。
你第一次外层循环i=0(对应值11)的时候,内层遍历所有元素都找不到和11相加等于10的数,arrResults还是空数组。这时候执行if (arrResults !== [])会得到true,直接跳出外层循环,根本不会走到i=1(对应值2)的逻辑,所以最终返回空数组。 - 次要逻辑问题:
- 内层循环j从0开始,会出现同一个元素重复使用、配对顺序颠倒的问题,应该调整为
j = i + 1,避免无效配对。 - 循环变量i、j没有用
let声明,会泄露为全局变量。
- 内层循环j从0开始,会出现同一个元素重复使用、配对顺序颠倒的问题,应该调整为
修复后代码
function sumPairs(ints, s) { let arrResults = []; let sumOfTwo; // 循环变量用let声明,避免全局泄露 for (let i = 0; i < ints.length; i++) { // j从i+1开始,避免重复配对、同元素复用 for (let j = i + 1; j < ints.length; j++) { sumOfTwo = ints[i] + ints[j]; if (sumOfTwo === s) { arrResults.push(ints[i], ints[j]); break; } } // 正确判空:判断数组长度是否大于0 if (arrResults.length > 0) { break; } } return arrResults; } console.log(sumPairs([11, 2, 7, 8, 4, 6], 10)); // 输出 [2, 8]
内容的提问来源于stack exchange,提问作者Natalia Grzywacz
相关产品推荐
相关产品推荐

