1. ホーム
  2. javascript

[解決済み] JavaScriptでオブジェクトの配列をクローンする方法は?

2022-03-19 01:18:29

質問

...ここで、各オブジェクトは同じ配列内の他のオブジェクトへの参照も持っていますか?

最初にこの問題を思いついたとき、私はちょうど次のようなものを考えていました。

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. ラウンド1では、配列内の他のオブジェクトを参照していないすべてのオブジェクトのクローンを作成します。 各オブジェクトの出自を記録しておいてください。
  2. 第2ラウンドでは、オブジェクトを互いにリンクさせます。