[解決済み] JavaScriptでオブジェクトの配列をクローンする方法は?
質問
...ここで、各オブジェクトは同じ配列内の他のオブジェクトへの参照も持っていますか?
最初にこの問題を思いついたとき、私はちょうど次のようなものを考えていました。
var clonedNodesArray = nodesArray.clone()
が存在することを知り、JavaScriptでオブジェクトをクローンする方法について情報を探しました。確かに見つけたのは 質問 Stack Overflow で(同じ @JohnResig が回答)、彼は jQuery を使って次のようなことができると指摘しています。
var clonedNodesArray = jQuery.extend({}, nodesArray);
を使ってオブジェクトをクローンすることができます。しかし、これを試してみたところ、これは配列内のオブジェクトの参照だけをコピーするものでした。ですから、もし私が
nodesArray[0].value = "red"
clonedNodesArray[0].value = "green"
とすると、nodesArray[0] と cloneNodesArray[0] の両方の値が "green" になってしまう。そこで
var clonedNodesArray = jQuery.extend(true, {}, nodesArray);
で、Object をディープコピーするのですが、" が出ました。 再帰性が高すぎる "と" スタックオーバーフローの制御 "の両方からのメッセージ ファイアバグ と オペラ座のトンボ それぞれ
あなたならどうする?これはやってはいけないことなのでしょうか?JavaScriptでこれを行うための再利用可能な方法はありますか?
どのように解決するのですか?
浅いコピーの問題は、すべてのオブジェクトがクローン化されていないことです。 各オブジェクトへの参照は各配列で一意ですが、最終的にそれをつかんだら、以前と同じオブジェクトを扱うことになります。 Array.slice()を使用しても同じ結果になります。
ディープコピーに問題があるのは、循環的なオブジェクト参照で終わってしまうからです。 Deepは行けるところまで行きますが、円形になるとブラウザが落ちるまで無限に進みます。
データ構造を有向無サイクルグラフで表現できない場合、ディープクローニングのための万能メソッドを見つけることができるかどうかわからない。 巡回グラフは多くの厄介なコーナーケースを提供しますし、一般的な操作ではないので、誰も完全な解決策を書いていないでしょう(もし可能であれば-それはないかもしれません!)。 しかし、今、厳密な証明を書こうとする時間はない。)。 この問題については、以下のサイトに良いコメントがありました。 このページ .
もし、循環参照を持つオブジェクトの配列のディープコピーが必要な場合は、マルチパスクローンのような特殊なデータ構造を処理する独自のメソッドをコーディングする必要があると思われます。
- ラウンド1では、配列内の他のオブジェクトを参照していないすべてのオブジェクトのクローンを作成します。 各オブジェクトの出自を記録しておいてください。
- 第2ラウンドでは、オブジェクトを互いにリンクさせます。
関連
-
Vueの要素ツリーコントロールに破線を追加する説明
-
[解決済み】React Nativeアプリをターミナルから実行するとエラーが発生する(iOS)
-
[解決済み】ExpressJS : res.redirect()が期待通りに動かない?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] HTML5のlocalStorageにオブジェクトを格納する方法は?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
Vueのクラススタイルの使い方の詳細
-
Vueのフォームイベントのデータバインディングの説明
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】「X-Frame-Options」を「SAMEORIGIN」に設定したため、フレームでの表示を拒否された。
-
[解決済み】gulp anythingを実行するたびに、アサーションエラーが発生します。- タスク関数を指定する必要があります
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
[解決済み】React-Redux: アクションはプレーンオブジェクトでなければならない。非同期アクションにはカスタムミドルウェアを使用する
-
JavaScriptのgetElementById、getElementsByTagNam、getElementsByClassNameの違いと使い方