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

aja*_*221 2 javascript arrays reference deep-copy

起初我以为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]
Run Code Online (Sandbox Code Playgroud)

(示例来源)

当您知道数组的结构时,所提供的链接上的解决方案相当容易(只是.slice(0)嵌套数组会做到这一点),但如果您不知道嵌套数组的结构如何,它会变得复杂.

我的第一个想法是在所有层面上循环整个事情,直到它找不到为止 排列 宾语.

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

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

xbo*_*nez 6

像nonnb建议的那样,序列化/反序列化循环将导致深层复制.你可以这样做:

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