簡體   English   中英

如何防止數組在for循環中更新?

[英]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) {

取決於哪個滿足您的要求

  1. 您在宣告var p = []; 里面的循環似乎是可行的,因為它是一個javascript,但非常令人困惑。 將其移至o = []附近的上桿;
  2. 您面臨的問題是因為您將引用推向數組,而不僅僅是值。 您需要在執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM