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

如何用Vanilla JavaScript交换数组对象值?类私有变量更新异常求助

拖拽排序交换index值异常的原因分析

核心问题

你在updateSortOrder方法中犯了一个关键错误:每次交换时克隆的是全局的sortOrder初始数组,而非类实例内部实时维护的私有变量#sortOrder。这导致后续所有交换操作都基于数组的初始状态,而非上一次更新后的最新状态,自然会出现异常结果。

逐次调用的错误过程拆解

  1. 第一次调用test.updateSortOrder(2, 3)
    此时全局数组和内部#sortOrder都是初始状态,克隆全局数组交换后,#sortOrder的index变为[0,1,3,2],结果符合预期。

  2. 第二次调用test.updateSortOrder(1, 2)
    你依旧克隆全局初始数组(index为[0,1,2,3]),然后将内部数组索引1的index设为克隆数组索引2的index(即2),索引2的index设为克隆数组索引1的index(即1)。但此时内部数组索引2的index原本是3,这一步直接被覆盖为1,导致#sortOrder变成[0,2,1,2],已经出现异常。

  3. 第三次调用test.updateSortOrder(0, 1)
    还是克隆全局初始数组,将内部数组索引0的index设为克隆数组索引1的index(1),索引1的index设为克隆数组索引0的index(0),最终得到你看到的异常输出。

修正方案

把克隆的目标换成类实例内部的this.#sortOrder,确保每次交换都基于当前最新的数组状态:

updateSortOrder(i1, i2) {
  // 克隆当前实例的私有数组,而非全局初始数组
  let sortOrderClone = structuredClone(this.#sortOrder);
  this.#sortOrder[i1].index = sortOrderClone[i2].index;
  this.#sortOrder[i2].index = sortOrderClone[i1].index;
  console.log(this.#sortOrder);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:31:12