You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:09:00