如何用循环获取数组后半部分?代码报错排查求助
用循环实现返回数组后半部分(奇数长度排除中间元素)
需求
返回包含数组后半部分的新数组,奇数长度数组需排除中间索引元素。
错误代码
function secondHalf(arr) { let newArr = []; for (let i = Math.floor(arr.length / 2); i >= 0; i--) { newArr.push(arr[i]); } return newArr; } secondHalf([1, 2]); secondHalf([1]);
测试报错信息
1) Problems secondHalf should return only the second half the array: AssertionError: expected [ 2, 1 ] to deeply equal [ 2 ] + expected - actual [ 2 - 1 ] at Context.<anonymous> (test/problems-specs.js:72:48) at processImmediate (node:internal/timers:466:21) 2) Problems secondHalf should be the exclusive first half: AssertionError: expected [ 1 ] to deeply equal [] + expected - actual -[ - 1 -] +[] at Context.<anonymous> (test/problems-specs.js:75:45) at processImmediate (node:internal/timers:466:21)
错误分析
你的代码有两个核心问题:
- 循环方向错误:从
Math.floor(arr.length / 2)开始往数组头部(i递减到0)遍历,导致把前半部分(甚至中间元素)倒序塞进新数组,完全不符合“取后半部分”的要求。 - 起始索引错误:对于奇数长度的数组(比如长度1),
Math.floor(arr.length / 2)得到0,会把中间元素(也是唯一元素)加入数组,但需求要求排除中间元素,此时应该返回空数组。
修正后的循环实现
function secondHalf(arr) { let newArr = []; // 计算起始索引:偶数长度取n/2,奇数长度取(n+1)/2(跳过中间元素) const startIndex = Math.ceil(arr.length / 2); // 从起始索引遍历到数组末尾,依次加入新数组 for (let i = startIndex; i < arr.length; i++) { newArr.push(arr[i]); } return newArr; } // 测试验证 console.log(secondHalf([1, 2])); // 输出 [2] console.log(secondHalf([1])); // 输出 [] console.log(secondHalf([1,2,3])); // 输出 [3] console.log(secondHalf([1,2,3,4,5])); // 输出 [4,5]
逻辑说明
Math.ceil(arr.length / 2)可以统一处理奇偶长度:- 偶数长度(比如2):
ceil(2/2)=1,从索引1开始遍历,取到后半部分元素; - 奇数长度(比如1):
ceil(1/2)=1,此时1 >= arr.length(1),循环不执行,返回空数组; - 奇数长度(比如3):
ceil(3/2)=2,从索引2开始遍历,跳过中间的索引1元素。
- 偶数长度(比如2):
- 循环从起始索引往数组末尾遍历,保证元素顺序和原数组后半部分一致。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

