具有嵌套数组的绝对无引用的数组副本

时间:2012-06-05 04:47:20

标签: javascript arrays reference deep-copy

起初我以为arr.slice(0)正在做一个未引用的副本,但它实际上只是做了一个未引用的副本,所以如果数组包含嵌套的数组,they are still referenced

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]

<子> (example source)

当你知道数组的结构时,所提供的链接上的解决方案相当容易(只需.slice(0)再次嵌套数组就可以了。)但是如果你不知道如何嵌套数组的结构是。

我的第一个想法是在所有级别上循环整个事情,直到它找不到数组对象。

  • 这种方法可以接受吗?
  • 是否有一些我缺少的内置功能?

我简直无法相信我只需复制一个愚蠢的数组就可以做到这一切

1 个答案:

答案 0 :(得分:6)

与nonnb建议一样,序列化/反序列化循环将导致深层复制。你可以这样做:

//a is some array with arbitrary levels of nesting.
var c = JSON.parse(JSON.stringify(a));