2017-06-02 98 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

相關問題