2016-03-28 11 views
2

これで、notaktoというゲームでAIを作ろうとしています。しかし、私は配列を複製する必要がある検索アルゴリズムを作るために、それほど関連はありません。だから私はこの[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]]のように見えるboardと呼ばれる全体的な配列を持っている0のすべてが異なる番号です。 これをコピーするには、次の行があります。 var newboard=board.slice()。問題は、私がnewboard[0][0]=1のようなコード行を実行したときも、次のようなコードを実行した場合のように動作することです。board[0][0]=1Javascriptの.slice()メソッドが値でコピーされない

+3

あなたはあまりにもネストされた配列の各コピーを作成する必要があります。 – Pointy

+0

'.slice()'は指定された配列のコピーを作成しますが、再帰的には動作しません。 – Barmar

+0

jQueryを使用している場合は、 '$ .extend'を使ってディープコピーを取得できます。 – Barmar

答えて

0

ネストされた配列は参照によってシャローコピーされているからです。あなたは、各ネストされた配列は値でコピーされることを確認して、ディープコピーに、そのようなあなたは上記の持っているものとして多次元配列をこのような再帰関数を使用することができます。

function copyMultidimensionalArray(array) { 
 
    var r = array.slice(0); 
 
    for (var i = 0, l = r.length; i < l; ++i) { 
 
     if (Array.isArray(r[i])) { 
 
      r[i] = copyMultidimensionalArray(r[i]); 
 
     } 
 
    } 
 
    return r; 
 
} 
 

 
/* example */ 
 

 
var board = [[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]], 
 
    anotherBoard = copyMultidimensionalArray(board); 
 

 
anotherBoard[0][0] = 99; 
 

 
document.write([ 
 
    "board[0][0] ===", 
 
    board[0][0], 
 
    "&& anotherBoard[0][0] ===", 
 
    anotherBoard[0][0] 
 
].join(" "));

1

あなたのコピー内部配列はコピーされません。これは、リッテ少しハックですが、それは動作します:

var newboard = JSON.parse(JSON.stringify(board)); 

この文脈では、それは動作しますが、あなたのオブジェクトは任意の機能を持っている場合は、これらの文字列化によって失われています。さらに、オブジェクトの内部に格納されているDataオブジェクトに何らかの問題を引き起こす可能性があります。

+0

他人がこれを盲目的にコピーしないように、このアプローチの限界を説明したいと思うかもしれません。 –

+0

@FelixKlingご助言ありがとうございます。私は、私が知っているいくつかの限界を述べるために投稿を編集しました。 – Querenker

0

javascriptは常に参照ベースです。重複コピーを作成したい場合は、重複コピーの代わりにディープオブジェクトコピーを実行してください。 角度では、angular.copy()は詳細コピーを実行します。

var newboard=angular.copy(board.slice());

+3

この質問に角タグはありません。 –

+0

これはその概念を理解するための例です。 –

0

また、ボードをコピーするboard.map(function(cv){ return cv.slice();})を使用することができます。

var board = [[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]]; 
 

 
var board2 = board.map(function(cv){ return cv.slice();}); 
 

 
board2[0][0] = 1; 
 

 
console.log(board); 
 
console.log(board2);

関連する問題