JS实现数组分割为等和两半的索引查找函数运行异常排查
错误原因
1. 切片边界逻辑完全错误
索引j对应的左右侧和计算,都不包含j位置的元素本身,正确的切片规则是:
- 左侧元素:索引范围
0~j-1,对应arr.slice(0, j)(slice第二个参数为结束索引,不包含在结果内) - 右侧元素:索引范围
j+1~末尾,对应arr.slice(j+1)
你的代码写的是arr.slice(0, j-1)和arr.slice(j):
- 左切片少拿了
j-1位置的元素,右切片多拿了j位置的元素,整体索引偏移了1位,你打印看到的[1,2,3] [3,2,1]对应的其实是j=4的情况,返回的索引和预期的3不符 - 当
j=0时j-1=-1,slice第二个参数为负数会从数组末尾倒数截取,arr.slice(0, -1)就是去掉最后一个元素的完整数组,和为15,右切片arr.slice(0)是完整数组和为16,这就是你看到打印输出15 16的原因
2. sum函数未处理空数组场景
当j=0时左侧是空数组,j=数组末尾索引时右侧是空数组,你写的reduce没有传初始值,空数组调用reduce会直接抛出类型错误,导致逻辑中断。
3. 循环边界冗余
数组有效索引范围是0~arr.length-1,你写的j <= l会循环到超出数组最大索引的位置,属于无效逻辑。
修正后代码
function findEvenIndex(arr) { // reduce加初始值0,兼容空数组求和 const sum = i => i.reduce((a, b) => a + b, 0); const len = arr.length; // 仅循环有效索引 for (let j = 0; j < len; j++) { if (sum(arr.slice(0, j)) === sum(arr.slice(j + 1))) { return j; } } return -1; } // 测试输出3,符合预期 console.log(findEvenIndex([1, 2, 3, 4, 3, 2, 1]));
内容的提问来源于stack exchange,提问作者untitiledunmastered
相关产品推荐
相关产品推荐

