JavaScript编写数组反转函数输出全为1的问题求助
JavaScript数组反转函数逻辑错误排查
你的代码运行后输出全为1的数组,没有实现反转效果,核心是嵌套循环的逻辑存在错误。
原实现代码
const arr = [1, 2, 3, 4, 5, 6, 7]; function rev(arr) { var value; var nArr = []; for (let i = arr.length - 1; i >= 0; i--) { value = arr[i]; for (let j = 0; j < arr.length; j++) { nArr[j] = value; } } console.log(nArr); } rev(arr);
错误原因
- 你额外加了一层完全不需要的内层循环:每次外层循环倒序拿到一个元素
value后,内层循环会遍历新数组的所有索引位置,把每个位置的值都覆盖为当前的value。 - 实际执行流程:
- 外层第一次循环取到最后一个元素
7,内层循环把新数组所有位置都设为7,新数组为[7,7,7,7,7,7,7] - 外层第二次循环取到倒数第二个元素
6,内层循环再次把新数组所有位置覆盖为6,新数组为[6,6,6,6,6,6,6] - 循环依次执行,最后一次外层循环取到原数组第一个元素
1,内层循环把所有位置覆盖为1,最终就得到了你看到的[1,1,1,1,1,1,1]
- 外层第一次循环取到最后一个元素
修正代码
删除多余的内层循环,每次倒序拿到元素后直接追加到新数组即可:
const arr = [1, 2, 3, 4, 5, 6, 7]; function rev(arr) { const nArr = []; for (let i = arr.length - 1; i >= 0; i--) { nArr.push(arr[i]); } console.log(nArr); return nArr; } rev(arr); // 输出 [7,6,5,4,3,2,1]
拓展参考实现
- 原生API方法:直接调用数组内置的
reverse()方法即可反转数组,注意该方法会直接修改原数组 - 双指针原地反转:不需要额外创建新数组,空间复杂度为O(1)
function revInPlace(arr) { let left = 0; let right = arr.length - 1; while (left < right) { // 交换首尾指针对应的元素 [arr[left], arr[right]] = [arr[right], arr[left]]; left++; right--; } return arr; }
内容的提问来源于stack exchange,提问作者Andre H
相关产品推荐
相关产品推荐

