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

使用扩展运算符复制二维数组后循环异常,直接赋值却正常?

问题原因分析:扩展运算符的浅拷贝特性导致二维数组引用冲突

核心问题出在扩展运算符对二维数组的浅拷贝上:

  • 当你用let result = [...matrix]初始化result时,只是把原matrix数组的第一层元素(也就是各个子数组)的引用复制到了result里。这意味着result[0]和matrix[0]指向的是同一个数组,修改result[j][i]本质上是在修改原matrix的子数组元素。
  • 你的循环逻辑需要读取原matrix的原始值来赋值,但前面的修改已经改变了原matrix的内容,后续循环读到的是被篡改后的数据,自然得不到正确的旋转结果。

而用固定二维数组[[1,2,3],[4,5,6],[7,8,9]]初始化result时,这个result是完全独立的全新数组,所有子数组都是新的内存引用,修改它不会影响原matrix,循环过程中始终能读取到matrix的原始值,所以能得到预期结果。

修复方案

要正确初始化独立的result数组,需要对二维数组做深拷贝(这里子元素都是基本类型,浅拷贝子数组即可),可以用map方法实现:

function rotateImage(n, matrix) {
    // 对每个子数组也做浅拷贝,确保result和matrix完全独立
    let result = matrix.map(row => [...row]);
    
    let count = 0
    
    for (let i = matrix.length - 1; i >= 0 ; i--) {
        for (let j = 0; j < matrix.length; j++) {
            result[j][i] = matrix[count][j];
        }
        count++
        if(count == 3){
            count = 2;
        };
    }
    return result;
}

如果数组元素包含复杂类型,也可以用JSON.parse(JSON.stringify(matrix))来实现深拷贝,不过这种方法对函数、Symbol等特殊类型不支持,仅适用于纯JSON数据结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:32:24