[英]Push() with Arrays of Arrays in Javascript
我試圖建立一個“數組數組”(想像一個具有列和行的表)。 我有遍歷每個“行”的代碼,並構建了一個“列”數組,然后將其壓入行數組:
var myRows = []; // array of 'column' arrays
var myCols = []; // 'buffer' for each column
for (r=4; r>=0; r--) {
myCols.length = 0;
for (c=0; c<10; c++) {
myCols.push("row: " + r +", col: " + c);
}
myRows.push(myCols);
}
console.log(myRows);
我對console.log(myRows)
期望是這樣的:
[Array[10], Array[10], Array[10], Array[10], Array[10]]
0: Array[10]
0: "row: 0, col: 0"
1: "row: 0, col: 1"
2: "row: 0, col: 2"
3: "row: 0, col: 3"
4: "row: 0, col: 4"
5: "row: 0, col: 5"
6: "row: 0, col: 6"
7: "row: 0, col: 7"
8: "row: 0, col: 8"
9: "row: 0, col: 9"
length: 10
__proto__: Array[0]
1: Array[10]
0: "row: 1, col: 0"
1: "row: 1, col: 1"
2: "row: 1, col: 2"
3: "row: 1, col: 3"
4: "row: 1, col: 4"
5: "row: 1, col: 5"
6: "row: 1, col: 6"
7: "row: 1, col: 7"
8: "row: 1, col: 8"
9: "row: 1, col: 9"
length: 10
...
但是,記錄的內容(在Chrome中)在每次迭代中均顯示該行為“ 0”。 不僅如此,如果我將迭代規則更改為不為0,它還顯示了“ myRows”數組集合的所有子數組的最后一個“行”。
真的很抓頭,關於push()方法我是否不了解?
每次通過外循環,您都需要創建一個新的 cols
數組。 您對每行使用相同的cols
數組,並對其進行修改,因為myRows.push(myCols)
將對該數組的引用推入,但不會產生副本。
更改:
myCols.length = 0;
至:
myCols = [];
myCols
的值是對數組的引用。
myRows.push(myCols);
將該值放入myRows
引用的myRows
。
在您的代碼中,這始終是相同的array 。
myCols.length = 0;
刪除該數組的內容。
每次循環時都需要創建一個新的數組。
替換myCols.length = 0;
與myCols = [];
您正在為每一列一遍又一遍地重復添加同一對象。 您需要在每次通過時創建一個新的Array
:
var myCols = [];
for (r=4; r>=0; r--) {
myCols = new Array(); // or temp = [];
for (c=0; c<10; c++) {
myCols.push("row: " + r +", col: " + c);
}
myRows.push(myCols);
}
您正在遇到此問題,因為javascript數組是按引用存儲的。 您不是在外部循環中創建新列,而是覆蓋現有列,而僅將對相同columns數組的新引用推入rows數組中。 本質上,行數組是對同一列數組的5個引用的數組。
為了克服這個問題,您必須像這樣在外部循環中創建一個新的myCols數組:
var myRows = []; // array of 'column' arrays
for (r=4; r>=0; r--) {
var myCols = []; // 'buffer' for each column
for (c=0; c<10; c++) {
myCols.push("row: " + r +", col: " + c);
}
myRows.push(myCols);
}
console.log(myRows);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.