これで、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]=1
Javascriptの.slice()メソッドが値でコピーされない
答えて
ネストされた配列は参照によってシャローコピーされているからです。あなたは、各ネストされた配列は値でコピーされることを確認して、ディープコピーに、そのようなあなたは上記の持っているものとして多次元配列をこのような再帰関数を使用することができます。
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(" "));
あなたのコピー内部配列はコピーされません。これは、リッテ少しハックですが、それは動作します:
var newboard = JSON.parse(JSON.stringify(board));
この文脈では、それは動作しますが、あなたのオブジェクトは任意の機能を持っている場合は、これらの文字列化によって失われています。さらに、オブジェクトの内部に格納されているDataオブジェクトに何らかの問題を引き起こす可能性があります。
他人がこれを盲目的にコピーしないように、このアプローチの限界を説明したいと思うかもしれません。 –
@FelixKlingご助言ありがとうございます。私は、私が知っているいくつかの限界を述べるために投稿を編集しました。 – Querenker
javascriptは常に参照ベースです。重複コピーを作成したい場合は、重複コピーの代わりにディープオブジェクトコピーを実行してください。 角度では、angular.copy()
は詳細コピーを実行します。
var newboard=angular.copy(board.slice());
この質問に角タグはありません。 –
これはその概念を理解するための例です。 –
また、ボードをコピーする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);
- 1. 引数なしのJavascript slice()メソッドを使用する
- 2. JavaScript .substr()と.slice()
- 3. Javascript marge and slice json
- 4. Javascript substring、slice not working
- 5. JavaScriptのメソッドやコピー
- 6. 。foreachループで.slice()が機能しない
- 7. PHPコピーがコピーされない
- 8. 新しいメソッドで「this」(JavaScript)が表示されない
- 9. JavaScript戻り値が返されない
- 10. v-bind:クラスデータバインドでメソッドの値が設定されない
- 11. iframeが実行されていないJavascriptメソッド(PHP)
- 12. 値でコピーJavascript DOMオブジェクト
- 13. ngClipboard:コピーで置換されない式の値
- 14. コピーGoogleアナリティクスビューで「コンテンツグループ」ルールがコピーされない
- 15. AWS S3コピー/ペーストでメタデータがコピーされない
- 16. JavaScriptで価値が得られない
- 17. なぜonclickから呼び出されたJavascriptメソッドでeが使用されていないのですか?
- 18. forEach()配列メソッドが呼び出されたメソッドからの戻り値。 JavaScript
- 19. メソッドが期待値を返さない
- 20. Pythonメソッドが値を返さない
- 21. .NET WebメソッドがJavaScriptから呼び出されないページ
- 22. angularJSのslice()メソッドpnオブジェクト配列の使い方
- 23. バインドされていないオブジェクトの値をコピーする
- 24. JavaScriptテーブルフィルターで数値が検索されない
- 25. Selenium Javascriptで値が取得されない
- 26. javascript If文でnull値が認識されない
- 27. StringBufferメソッドのパラメータ - 値が変更されない
- 28. RESTfulな「コピー」メソッド
- 29. SQLiteデータベースがiPhoneにコピーされない
- 30. ローカルコピー - .dllがコピーされない
あなたはあまりにもネストされた配列の各コピーを作成する必要があります。 – Pointy
'.slice()'は指定された配列のコピーを作成しますが、再帰的には動作しません。 – Barmar
jQueryを使用している場合は、 '$ .extend'を使ってディープコピーを取得できます。 – Barmar