2012-07-05 202 views
21

我試圖推到一個二維數組沒有它搞亂了,目前我的數組是:推()二維數組

var myArray = [ 
[1,1,1,1,1], 
[1,1,1,1,1], 
[1,1,1,1,1] 
] 

而且我的代碼,我想的是:

var r = 3; //start from rows 3 
var c = 5; //start from col 5 

var rows = 8; 
var cols = 7; 

for (var i = r; i < rows; i++) 
{ 
    for (var j = c; j < cols; j++) 
    { 
     myArray[i][j].push(0); 
    } 
} 

這應該導致以下:

var myArray = [ 
[1,1,1,1,1,0,0], 
[1,1,1,1,1,0,0], 
[1,1,1,1,1,0,0], 
[0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0], 
] 

但事實並非如此,不知道這是否是做或不正確的方法。

所以問題是我該如何做到這一點?

+2

什麼*不*它呢? – 2012-07-05 14:03:29

回答

30

你有一些錯誤,在你的代碼:

  1. 使用myArray[i].push(0);添加一個新列。您的代碼(myArray[i][j].push(0);)將在三維數組中工作,因爲它會嘗試將另一個元素添加到位置爲[i][j]的數組。
  2. 您只能在所有行中擴展(col-d)列列,即使在尚未初始化的列中也是如此,因此目前沒有條目。

一個正確的,但那種詳細的版本,會是以下幾點:

var r = 3; //start from rows 3 
var c = 5; //start from col 5 

var rows = 8; 
var cols = 7; 

// expand to have the correct amount or rows 
for(var i=r; i<rows; i++) { 
    myArray.push([]); 
} 

// expand all rows to have the correct amount of cols 
for (var i = 0; i < rows; i++) 
{ 
    for (var j = myArray[i].length; j < cols; j++) 
    { 
     myArray[i].push(0); 
    } 
} 
+3

哦,我現在看它如何工作,謝謝。 – Jo3la 2012-07-05 14:37:03

2
var r = 3; //start from rows 3 
var c = 5; //start from col 5 

var rows = 8; 

var cols = 7; 


for (var i = 0; i < rows; i++) 

{ 

for (var j = 0; j < cols; j++) 

{ 
    if(j <= c && i <= r) { 
     myArray[i][j] = 1; 
    } else { 
     myArray[i][j] = 0; 
    } 
} 

} 
+2

(1)你有一個語法錯誤:在'else'之前缺少'{'''。 (2)如果有要添加的行,此代碼將不起作用:'ReferenceError:未定義myArray'。 – Sirko 2012-07-05 14:15:35

+1

是添加{。有一個引用錯誤,因爲我猜這是一段內聯代碼,並且數組已經存在,因爲它們應該是上面的代碼片段。 – Daniel 2012-07-05 14:38:28

4

您可以通過所有行循環,並添加缺少的行和列。對於已經存在的行,則循環從C到的cols,爲新的行,第一推空數組到外部陣列,然後循環從0到COLS:

var r = 3; //start from rows 3 
var c = 5; //start from col 5 

var rows = 8; 
var cols = 7; 

for (var i = 0; i < rows; i++) { 
    var start; 
    if (i < r) { 
    start = c; 
    } else { 
    start = 0; 
    myArray.push([]); 
    } 
    for (var j = start; j < cols; j++) { 
     myArray[i].push(0); 
    } 
} 
0

您呼叫上的推()數組元素(INT),其中按()應在陣列上調用,也處理/填充陣列這種方式是沒有意義的 你可以做這樣的

for (var i = 0; i < rows - 1; i++) 
{ 
    for (var j = c; j < cols; j++) 
    { 
    myArray[i].push(0); 
    } 
} 


for (var i = r; i < rows - 1; i++) 
{ 

    for (var j = 0; j < cols; j++) 
    { 
     col.push(0); 
    } 
} 

你也可以使用二者結合起來循環if if條件,如果行< r,否則如果行> = r

+1

你給的代碼是錯的,我想。請檢查 – 999k 2014-07-23 12:49:08

4

遍歷兩個維度意味着您需要檢查兩個維度。

假設你開始:

var myArray = [ 
    [1,1,1,1,1], 
    [1,1,1,1,1], 
    [1,1,1,1,1] 
]; //don't forget your semi-colons 

要擴展這個二維數組變成:

var myArray = [ 
    [1,1,1,1,1,0,0], 
    [1,1,1,1,1,0,0], 
    [1,1,1,1,1,0,0], 
    [0,0,0,0,0,0,0], 
    [0,0,0,0,0,0,0], 
    [0,0,0,0,0,0,0], 
]; 

這意味着你需要了解有什麼區別。

開始與外部陣列:

var myArray = [ 
    [...], 
    [...], 
    [...] 
]; 

如果你想使這陣時間越長,你需要檢查它的正確長度,並添加更多的內部陣列來彌補差額:

var i, 
    rows, 
    myArray; 
rows = 8; 
myArray = [...]; //see first example above 
for (i = 0; i < rows; i += 1) { 
    //check if the index exists in the outer array 
    if (!(i in myArray)) { 
     //if it doesn't exist, we need another array to fill 
     myArray.push([]); 
    } 
} 

下一步需要循環訪問每個陣列中的每個列,我們將建立在原代碼:

var i, 
    j, 
    row, 
    rows, 
    cols, 
    myArray; 
rows = 8; 
cols = 7; //adding columns in this time 
myArray = [...]; //see first example above 
for (i = 0; i < rows; i += 1) { 
    //check if the index exists in the outer array (row) 
    if (!(i in myArray)) { 
     //if it doesn't exist, we need another array to fill 
     myArray[i] = []; 
    } 
    row = myArray[i]; 
    for (j = 0; j < cols; j += 1) { 
     //check if the index exists in the inner array (column) 
     if (!(i in row)) { 
      //if it doesn't exist, we need to fill it with `0` 
      row[j] = 0; 
     } 
    } 
} 
3

在你的情況,你可以做到這一點,而無需使用push可言:

var myArray = [ 
    [1,1,1,1,1], 
    [1,1,1,1,1], 
    [1,1,1,1,1] 
] 

var newRows = 8; 
var newCols = 7; 

var item; 

for (var i = 0; i < newRows; i++) { 
    item = myArray[i] || (myArray[i] = []); 

    for (var k = item.length; k < newCols; k++) 
     item[k] = 0;  
} 
+1

謝謝非常有用,是否可以刪除添加的行?也許我可以使用上面的同樣的方法,但是用spl [k] .splice(k,1)刪除添加的行/列 – Jo3la 2012-07-05 15:40:45

+1

因爲添加的行被附加了,所以可以使用'length'來刪除它們:'myArray .length = 3';使最後的'5'被丟棄(假設你有'8'行)。 – ZER0 2012-07-05 16:23:01

+1

啊哈並不認爲這是可能的。長度,現在得到它的工作......謝謝。 – Jo3la 2012-07-05 19:01:58

0

創建上午陣列,並把第一個裏面,在這種情況下,我得到的數據,從JSON響應

$.getJSON('/Tool/GetAllActiviesStatus/', 
    var dataFC = new Array(); 
    function (data) { 
     for (var i = 0; i < data.Result.length; i++) { 
      var serie = new Array(data.Result[i].FUNCAO, data.Result[i].QT, true, true); 
      dataFC.push(serie); 
     });