2012-07-14 29 views
2

我有一個多維數組像這樣:奇怪的JavaScript數組行爲。它可以修復嗎?

var map = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]; 

我然後有幾個函數「調整大小」的陣列在兩個維度上,這取決於某些變量。這就是我要做的事:

function resizeArr(arr, rows, rowsDiff, cols, colsDiff) { 
    var arrLength = arr.length; 

    if (colsDiff > 0) { 
     i=0; 
     while (i<arrLength) { 
      j=0; 
      while (j<colsDiff) { 
       arr[i].push(0); 
       j++ 
      } 
      i++ 
     } 
    } 
    if (colsDiff < 0) { 
     i=0; 
     while (i<arrLength) { 
      j=0; 
      colsDiffAbs = Math.abs(colsDiff); 
      while (j<colsDiffAbs) { 
       arr[i].pop(); 
       j++ 
      } 
      i++ 
     } 
    } 

    if (rowsDiff > 0) { 
     fullColsArr = makeArrayOf(0, cols); 
     i=0; 
     while (i<rowsDiff) { 
      arr.push(fullColsArr); 
      i++ 
     } 
    } 
    if (rowsDiff < 0) { 
     rowsDiffAbs = Math.abs(rowsDiff); 
     i=0; 
     while (i<rowsDiffAbs) { 
      arr.pop(); 
      i++ 
     } 
    } 
    return arr; 
} 

基本上,與4 if語句,我蹦出來的某些值或推一些新的(零)取決於rowsDiff/colsDiff變量是正還是負。

我的問題是,當我從地圖的最大調整陣列[4] [4]映射[9] [9],它看起來像一切都還好,因爲我得到:

[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]] 

爲我的新陣列,看起來不錯。然而,當我嘗試分配一個特定的值來映射[9] [9],它填補了每一個新的數組的最後一個值,如下所示:

[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14],[0,0,0,0,0,0,0,0,0,14]] 

如果我試圖分配一個值到所述第二至最後一個值(圖[9] [8]),它填滿了所有其他值的倒數第二個值。

但是,當我給數組的原始部分賦值時,它可以正常工作。 我在這裏做錯了什麼?

我試圖用我的能力來解釋它 - 隨時要求進一步的細節。

回答

4

當您按行展開時,您正在多次按相同的數組。因此,數組的每一行都只是指向相同的位置(相同的列數組)。因此,當你改變一個,他們「全部」似乎改變。

相反,你要創建的每個新行一個新的陣列和推送:

if (rowsDiff > 0) { 
    i=0; 
    while (i<rowsDiff) { 
     arr.push(makeArrayOf(0, cols)); 
     i++ 
    } 
} 
+0

完美!謝謝:)我不知道爲什麼我沒有想到這一點。對我來說另一個學習經歷,嘿嘿。 – DavidPM 2012-07-14 21:29:39