JavaScript中基于未知维度数组初始化新数组及元素交换问题
你的判断与问题原因
你的判断完全正确。在JavaScript中,数组属于引用类型,var result = arr并没有创建全新的数组副本,只是让变量result和arr指向内存中同一个数组对象。因此,对result的任何修改都会直接作用到原数组arr上。
除此之外,你的交换逻辑本身也存在错误:执行result[i][j][0] = arr[i][j][1]时,由于result和arr指向同一对象,原数组的arr[i][j][0]已被覆盖为arr[i][j][1]的值;后续执行result[i][j][1] = arr[i][j][0]时,实际上是把已经修改后的(也就是原arr[i][j][1])值再次赋值给第二个元素,最终导致两个元素变成相同的值。
正确的实现方案
根据是否需要保留原数组,提供两种可行方案:
方案1:保留原数组,生成交换后的新数组
需要逐层创建数组副本,确保新数组与原数组完全独立:
function switch_coordinate_columns3D(arr) { const result = []; for (let i = 0; i < arr.length; i++) { result[i] = []; // 遍历长度可能不同的二维子数组 for (let j = 0; j < arr[i].length; j++) { // 直接创建交换后的第三维度数组 result[i][j] = [arr[i][j][1], arr[i][j][0]]; } } return result; }
如果第三维度长度不固定为2,可以用更通用的写法:
function switch_coordinate_columns3D(arr) { const result = []; for (let i = 0; i < arr.length; i++) { result[i] = []; for (let j = 0; j < arr[i].length; j++) { // 浅拷贝第三维度子数组,避免引用原数组 const tempArr = [...arr[i][j]]; // 解构赋值交换索引0和1的元素 [tempArr[0], tempArr[1]] = [tempArr[1], tempArr[0]]; result[i][j] = tempArr; } } return result; }
方案2:允许修改原数组(无需创建新数组)
如果不需要保留原数组,只需修正交换逻辑,用临时变量暂存值避免覆盖即可:
function switch_coordinate_columns3D(arr) { for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr[i].length; j++) { const temp = arr[i][j][0]; arr[i][j][0] = arr[i][j][1]; arr[i][j][1] = temp; } } return arr; }
内容的提问来源于stack exchange,提问作者leparc
相关产品推荐
相关产品推荐

