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

如何使用循环原地重排数组,修复JS实现代码的逻辑错误

代码逻辑疏漏点

你的遍历逻辑只对每个下标位置做单次校验处理,交换后当前位置新得到的非-1元素不会被二次校验,导致部分元素永远无法被放到正确位置。

具体错误复现:

以你给出的测试数组为例:

  1. 遍历到i=1时,当前元素是8,交换arr[1]和arr[8],交换后arr[1]的值变成0
  2. 你的循环直接执行i++进入i=2的判断,留在i=1位置的0再也没有机会被处理到下标0的位置,最终结果不符合预期。

修正方案

只需要在每个下标位置增加循环校验,直到当前位置的元素是-1或者已经处于正确位置,再进入下一个下标的判断:

let arr = [-1, 8, -1, 6, -1, 4, -1, 2, 0, -1];

for (let i = 0; i < arr.length; i++) {
  // 循环处理当前i位置的元素,直到无需处理再往下走
  while (arr[i] !== -1 && arr[i] !== i) {
    const targetIndex = arr[i];
    // 交换元素
    [arr[i], arr[targetIndex]] = [arr[targetIndex], arr[i]];
  }
}

console.log(arr); // 输出 [0,-1,2,-1,4,-1,6,-1,8,-1]

内容的提问来源于stack exchange,提问作者brk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:15:02