如何用Vanilla JavaScript交换数组对象值?类私有变量更新异常求助
拖拽排序交换index值异常的原因分析
核心问题
你在updateSortOrder方法中犯了一个关键错误:每次交换时克隆的是全局的sortOrder初始数组,而非类实例内部实时维护的私有变量#sortOrder。这导致后续所有交换操作都基于数组的初始状态,而非上一次更新后的最新状态,自然会出现异常结果。
逐次调用的错误过程拆解
第一次调用
test.updateSortOrder(2, 3)
此时全局数组和内部#sortOrder都是初始状态,克隆全局数组交换后,#sortOrder的index变为[0,1,3,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],已经出现异常。第三次调用
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
相关产品推荐
相关产品推荐

