javascript - 在 3D 数组中嵌套 2D 数组时的奇怪行为

标签 javascript debugging multidimensional-array

目前,我正在为 javascript 中的四行开发一个 Minimax 算法。我决定将可能的移动存储在一个数组中,继续为每个分支在数组中嵌套数组。

但是,当我尝试编辑数组中的某个值时,它会编辑同一列中的所有其他值。

代码:

var BOARD = [
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
    ];

// Put 3 x 2D Arrays into one 3D Array
var NODE_TREE = [BOARD, BOARD, BOARD];
NODE_TREE[1][2][0] = 2;
console.log(NODE_TREE);

Chrome V8 解释器输出:

[ [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 2, 0, 0 ] ],
  [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 2, 0, 0 ] ],
  [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 2, 0, 0 ] ] ]

应该发生但没有发生的事情:

[ [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
  [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 2, 0, 0 ] ],
  [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ] ]

Javascript 似乎忽略了第一维索引号。仅当我使用嵌套在数组中的现有数组时才会发生此问题。如果我要从头开始制作 3D 阵列,则不会发生此错误。

最佳答案

对于惰性初始化,您可以使用已解析的 JSON字符串。

这会生成一个不引用原始对象的独立对象。

var BOARD = [
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]
    ],
    JSON_BOARD = JSON.stringify(BOARD),
    NODE_TREE = [JSON.parse(JSON_BOARD), JSON.parse(JSON_BOARD), JSON.parse(JSON_BOARD)];

NODE_TREE[1][2][0] = 2;
console.log(NODE_TREE);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 在 3D 数组中嵌套 2D 数组时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44325821/

相关文章:

javascript - 使用 javascript 对元素列表进行分类/分组和排序的最佳方法是什么?

Javascript小计函数仅适用于表格的第一行

javascript - 如何在 JavaScript 中循环播放声音?

linux - 在 perl 中停止具有条件的进程

javascript - 在书签中转义原始的、未转义的字符串

c - 如何在 Linux 内核中跟踪传出 ICMP 数据包的代码路径?

c# - 类调试,如何知道从哪里调用类

php - 包含动态子数组的数组;只捕获最后一个子数组

ios - 如何用二维数组填充表格 View ?

arrays - 连接4个对角线赢支票