[英]How to prevent an array from updating in a for-loop?
有一個包含許多其他數組的外部數組。 我生成內部數組,然后將它們推到外部數組。
for (i = 0; i < 12; i++) {
if (i == 0) {
var p = [];
for (n = 0; n < 4; n++) {
p.push(n);
}
} else {
s = i % (3);
var b = p[s+1];
p[s+1] = p[s];
p[s] = b;
}
console.log(p);
}
/*OUTPUT:
Array(4) [ 0, 1, 2, 3 ]
tsp.js:45:17
Array(4) [ 0, 2, 1, 3 ]
tsp.js:45:17
Array(4) [ 0, 2, 3, 1 ]
tsp.js:45:17
Array(4) [ 2, 0, 3, 1 ]
tsp.js:45:17
Array(4) [ 2, 3, 0, 1 ]
tsp.js:45:17
Array(4) [ 2, 3, 1, 0 ]
tsp.js:45:17
Array(4) [ 3, 2, 1, 0 ]
tsp.js:45:17
Array(4) [ 3, 1, 2, 0 ]
tsp.js:45:17
Array(4) [ 3, 1, 0, 2 ]
tsp.js:45:17
Array(4) [ 1, 3, 0, 2 ]
tsp.js:45:17
Array(4) [ 1, 0, 3, 2 ]
tsp.js:45:17
Array(4) [ 1, 0, 2, 3 ]
*/
此代碼按預期輸出許多不同的數組。 但這一次又一次輸出包含相同數組的一個數組:
o = [];
for (i = 0; i < 12; i++) {
if (i == 0) {
var p = [];
for (n = 0; n < 4; n++) {
p.push(n);
}
} else {
s = i % (3);
var b = p[s+1];
p[s+1] = p[s];
p[s] = b;
}
o.push(p);
}
console.log(o);
/*
OUTPUT:
(12) […]
0: Array(4) [ 1, 0, 2, … ]
1: Array(4) [ 1, 0, 2, … ]
2: Array(4) [ 1, 0, 2, … ]
3: Array(4) [ 1, 0, 2, … ]
4: Array(4) [ 1, 0, 2, … ]
5: Array(4) [ 1, 0, 2, … ]
6: Array(4) [ 1, 0, 2, … ]
7: Array(4) [ 1, 0, 2, … ]
8: Array(4) [ 1, 0, 2, … ]
9: Array(4) [ 1, 0, 2, … ]
10: Array(4) [ 1, 0, 2, … ]
11: Array(4) [ 1, 0, 2, … ]
length: 12
<prototype>: Array []
tsp.js:47:13
*/
我期望第二個代碼從打包在一個數組中的for循環輸出所有不同的數組,但事實並非如此。
當你做o.push(p);
您正在將p
的引用推入數組。 這意味着在循環的每次迭代中,當您修改p
中的元素時,引用處的元素都會更改,從而更改o
數組中的數組。
因此,在將p
數組推入o
數組之前,需要對其進行唯一引用。 一種方法是使用.slice()
來復制數組,如下所示:
var o = []; for (var i = 0; i < 12; i++) { if (i == 0) { var p = []; for (var n = 0; n < 4; n++) { p.push(n); } } else { var s = i % (3); var b = p[s + 1]; p[s + 1] = p[s]; p[s] = b; } o.push(p.slice()); // copy the elements in p to a new array, such that the array is now it's own unique reference in memory } console.log(o);
這兩個示例的一個問題是,您在if
分支中聲明了p
,但在else
分支和封閉范圍中對其進行了引用。
嘗試將其移至函數的開頭:
for (i = 0; i < 12; i++) {
var p = [];
if (i == 0) {
要么
var p = [];
for (i = 0; i < 12; i++) {
if (i == 0) {
取決於哪個滿足您的要求
您面臨的問題是因為您將引用推向數組,而不僅僅是值。 您需要在執行o.push()之前將值復制到新數組。
var o = []; var p = []; for (i = 0; i < 12; i++) { if (i == 0) { for (n = 0; n < 4; n++) { p.push(n); } } else { s = i % (3); var b = p[s + 1]; p[s + 1] = p[s]; p[s] = b; } var copy = []; for (j = 0; j < p.length; j++) { copy.push(p[j]); } o.push(copy); } console.log(o);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.