TypeScript(JavaScript)二維數組深拷貝

最近遇到一個二維數組深拷貝的問題,原以爲和一維數組深拷貝一樣,實際上被打臉了。

於是寫了點測試代碼驗證一下,由於ts不能像c++那樣查看數組變量的地址,所以這裏使用===來判斷兩個對象是否相同(即同一個引用,內存指向同一個地址)。

代碼如下:

        //一維數組深拷貝
        let num1: number[] = [1,2,3,4];
        let num2: number[] = num1.concat();
        num2[0] = 6;
        num2.push(5);
        console.log("num1:" + num1);
        console.log("num2:" + num2);

        //二維數組“深”拷貝?
        let num3: number[][] = [[1,2,3,4], [5,6,7,8]];
        let num4: number[][] = num3.concat();
        num4[0][0] = 6;
        console.log("num3[0]:" + num3[0]);
        console.log("num4[0]:" + num4[0]);

        if(num1 === num2){
            console.log("num1和num2是同一個引用");
        }else{
            console.log("num1和num2不是同一個引用");
        }

        if(num3[0] === num4[0]){
            console.log("num3[0]和num4[0]是同一個引用");
        }else{
            console.log("num3[0]和num4[0]不是同一個引用");
        }

輸出如下:

從輸出日誌可以看出,一維數組使用concat方法是能實現深拷貝的,但是二維數組是不行的。

我的理解:concat方法只會深拷貝一維裏面的數據,當要拷貝的數組是一維的時候,能達到我們預期的效果。當要拷貝的數組是二維的時候,由於二維數組的第一維裏面存放的是第二維數組的地址,而第二維裏面數據纔是我們要拷貝的內容。所以纔會出現上述日誌中的num3[0]和num4[0]是同一個引用的結果。

那麼要如何實現二維數組的深拷貝呢?

        let num3: number[][] = [[1,2,3,4], [5,6,7,8]];
        let num4: number[][] = num3.concat();
        let num5: number[][] = [];
        for(let index: number = 0; index < num3.length; index++){
            let temp: number[] = num3[index].concat();
            num5.push(temp);
        }

用for循環一個個拷貝一維數組就行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章