2

arr.slice(0)最初は、深い非参照コピーを実行していると思いましたが、実際には浅い非参照コピーを実行しているため、配列にネストされた配列が含まれている場合でも、それらは参照されます。

var a = [1,2]
var b = [3,4]
var c = [a,b]
var d = c.slice(0)
d[0] === a       // true, which means it is the /same/ object
d[0][0] = "Hi!"
a                // ["Hi!", 2]

(ソース例)

提供されるリンクの解決策は、配列の構造がわかっている場合はかなり簡単です(.slice(0)ネストされた配列をもう一度実行するだけでうまくいきます)が、ネストされた配列の構造がわからない場合は複雑になります。

私の最初のアイデアは、すべてのレベルで、それが見つからなくなるまで、すべてをループすることです。配列物体。

  • このアプローチは受け入れられますか?
  • 不足している組み込み関数はありますか?

ばかげた配列をコピーするためだけにそれをすべて行う必要があるとは信じられません

4

1 に答える 1

6

nonnb が示唆するように、シリアライゼーション/デシリアライゼーション サイクルにより、ディープ コピーが作成されます。次のようにできます。

//a is some array with arbitrary levels of nesting.
var c = JSON.parse(JSON.stringify(a));
于 2012-06-05T05:05:55.937 に答える