文章出處

數組的拷貝

  > 數組的深拷貝,兩層
var arr = [[1,2,3],[4,5,6],[7,8,9]];

var arr2 = [];
循環第一層數組
for(var i=0,len=arr.length;i<len;i++){
  循環第二層數組
for(var k=0,lens=arr[i].length;k<lens;k++){
    把每一個數組的內容添加到數組2中 arr2.push(arr[i][k]); } } console.log(arr2);
//[1, 2, 3, 4, 5, 6, 7, 8, 9] console.log(arr===arr2); //false
  > 數組的淺拷貝,一層
var arr = [1,2,3,4,5,6,7,8];
var arr2 = [];
for(var i=0,len=arr.length;i<len;i++){
    arr2.push(arr[i]);
}

console.log(arr2);
console.log(arr===arr2);
  > 數組的深拷貝,三層
    var arr = [[1,2,3,[4,5]],[[6,7,8,9]],10,11];
    var arr2 = [];
    // 第一層循環
    for(var i=0,len=arr.length;i<len;i++){

     // 如果第一層不是數組則直接拷貝到數組2中
     if(typeof arr[i]!=="object"){
       arr2.push(arr[i]);
     }

// 第二層
        for(var k=0,len1=arr[i].length;k<len1;k++){
            // 判斷第二層是否是數組,這里簡單的判斷力一下是不是對象,沒有做處理。
            if(typeof arr[i][k]==="object"){
                // 如果是數組,繼續循環此數組。
                for(var j=0,len2=arr[i][k].length;j<len2;j++){
                    arr2.push(arr[i][k][j]);
                }
            }else{
                // 不是數組就按照正常情況執行。
                arr2.push(arr[i][k]);
            }
            
        }
    }

    console.log(arr2); //[1, 2, 3, 4, 5, 6, 7, 8, 9,10,11]
    console.log(arr===arr2); //false    
  > 數組的深拷貝,無限層,正則版 1.0
    var arr = [[1,2,3,[4,5]],[[6,7,8,9]],10,11,12,13,[14,[15,16,17,[18,[19,[20]]]]]];
    var arr2 = [];
// 先把數組轉換成字符串,然后將字符串里面的[]刪除 var str = arr.toString().replace(/\[|\]/,""); console.log(str); //1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

// 將字符串轉換成數組。 arr2 = str.split(",");
console.log(arr2); //["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] console.log(arr
===arr2); //false

  // 這樣做的話簡單了不少,而且擴展性比較強,但是現在出現了個bug,就是我們原本數組里面的是數字,現在變成了字符串,下面我們來解決一下這個問題。

  > 數組的深拷貝,無限層,正則版 2.0
    var arr = [[1,2,3,[4,5]],[[6,7,8,9]],10,11,12,13,[14,[15,16,17,[18,[19,[20]]]]],"a"];
    var arr2 = [];
// 先把數組轉換成字符串,然后將字符串里面的[]刪除 var str = arr.toString().replace(/\[|\]/,""); console.log(str); //1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

// 將字符串轉換成數組。 arr2 = str.split(","); for(var i=0,len=arr2.length;i<len;i++){ // 判斷是否可以轉換成數字,如果可以則轉換,否則不轉換。 arr2[i] = parseFloat(arr2[i])||arr2[i]; } console.log(arr2); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, "a"] console.log(arr===arr2); //false

  雖然這里解決了上面的問題,但實際上還是有些問題的,就是如果arr1里面的數字原本就是字符串那么這個就有問題了,因為這個我們設置的是只要它可以轉換成數字都將被轉換。如果要解決這個問題的話,我們在將數組轉換成字符串之前就要進行判斷里面的內容是數字還是字符串,但是如果這樣的話,我們用正則的方式將會變的非常麻煩,因為技術有限,只能解決到這里,如果你有好的方法,還請告知一下。

 

 對象的克隆和數組的克隆差不多,這里就不再說了,另外以前還寫了一篇關于克隆方面的文章,有興趣的話可以參考一下。

JS基礎回顧,小練習(克隆對象,數組)


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()