對將數組推入數組感到困惑,JavaScript

凱文

我的代碼看起來像這樣

var res = [];
var temp = [];

function Permutations(target, size) {
  if (size === 0) {
    res.push(temp);
    console.log(res);
    return;
  }

  for (let i = 0; i < target.length; i++) {
    if (target[i] !== null) {
      temp.push(target[i]);
      target[i] = null;

      Permutations(target, size - 1);

      target[i] = temp.pop();
    }
  }
}

Permutations([1, 2, 3], 2);
console.log(res);

當我運行我的代碼時,我可以看到我的 res 存儲正在執行的每個排列。但是,當我在函數之外記錄它時,所有存儲的值都消失了。

[ [ 1, 2 ] ]
[ [ 1, 3 ], [ 1, 3 ] ]
[ [ 2, 1 ], [ 2, 1 ], [ 2, 1 ] ]
[ [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [ 2, 3 ] ]
[ [ 3, 1 ], [ 3, 1 ], [ 3, 1 ], [ 3, 1 ], [ 3, 1 ] ]
[ [ 3, 2 ], [ 3, 2 ], [ 3, 2 ], [ 3, 2 ], [ 3, 2 ], [ 3, 2 ] ]
[ [], [], [], [], [], [] ]   // This is my console.log outside the function
尼采

temp代碼的整個執行過程中,數組保持是同一個數組。res.push(temp);會將此相同的數組(不是它的副本)到您的res陣列。

這裡有一個關於如何在 JavaScript 中處理對象的相關問題:JavaScript 是按引用傳遞還是按值傳遞語言?

所以你的代碼導致resN時間相同的數組。

您可以使用 將存儲的元素複製temp到新數組中[...temp],然後將其推送到您的res數組中。

var res = [];
var temp = [];

function Permutations(target, size) {
  if (size === 0) {
    res.push([...temp]);
    return;
  }

  for (let i = 0; i < target.length; i++) {
    if (target[i] !== null) {
      temp.push(target[i]);
      target[i] = null;

      Permutations(target, size - 1);

      target[i] = temp.pop();
    }
  }
}

Permutations([1, 2, 3], 2);
console.log(res);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章