2017-06-02 103 views
4

目前,我正在为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阵列,这个错误不会发生。

+2

大家一个参考添加到阵列,wihout制作值的深层副本。 –

+0

@NinaScholz请你举个例子,我查了一下引用是什么,然而,我找不到任何有用的东西。 – imavajine

回答

1

对于一个懒惰initalization,你可以使用一个解析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; }

1

当您将BOARD放入数组中时,您并不是将项目“复制”到新数组中,而是实际上只是创建3个对原始BOARD数组的引用。

因此,对任何一个参考文献所做的任何更改都将反映在BOARD的所有实例中。

如果你想在你的3d数组中创建3个不同的数组,你将需要克隆或复制数组。你可以通过在外部数组上映射并使用Array.prototype.slice()来复制内容。

var BOARD = [ 
 
    [0, 0, 0], 
 
    [0, 0, 0], 
 
    [0, 0, 0] 
 
    ]; 
 
    
 
// function to map and copy arrays with .slice() 
 
function sliceArrays (outerArray){ 
 
    return outerArray.map((arr)=>{ 
 
    return arr.slice() 
 
    }); 
 
} 
 

 
var NODE_TREE = [sliceArrays(BOARD), sliceArrays(BOARD), sliceArrays(BOARD)]; 
 
NODE_TREE[1][2][0] = 2; 
 
console.log(NODE_TREE); 
 

 
//[ [ [ 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 ] ] ]

+0

同样的问题仍然存在。 – imavajine

+0

切片仅适用于原始值。 –

+0

我正在使用原始值,但我仍然遇到问题。 – imavajine

相关问题