JavaScript 深拷贝(只考虑对象和数组类型),请问大家递归深拷贝的方法可以使用栈或者队列来实现呢?怎么实现呢?自己写不明白了。。

2018-02-10 09:50:31 +08:00
 onyourroad

以下是我写的简单的递归方式的深拷贝。

  function copy(source) {
    var key, target
    if (type(source) === "array") {
      target = []
      for (key = 0; key < source.length; key++) {
        if (type(source[key]) === "array" || "object") {
          target[key] = copy(source[key])
        } else if (source[key] !== undefined) target[key] = source[key]
      }
    } else if (type(source) === "object") {
      target = {}
      for (key in source) {
        if (type(source[key]) === "array" || "object") {
          target[key] = copy(source[key])
        } else if (source[key] !== undefined) target[key] = source[key]
      }
    }

    return target
  }
2308 次点击
所在节点    问与答
10 条回复
bumz
2018-02-10 10:27:56 +08:00
献上拙劣的代码实现的简陋的想法

https://gist.github.com/bumfo/b41088a717a0ee633fb91ce1b334b4fb
ulala
2018-02-10 10:49:05 +08:00
if (type(source[key]) === "array" || "object") {
这是要表达什么?
onyourroad
2018-02-10 11:00:46 +08:00
@bumz 看不到。。
iFun
2018-02-10 11:23:53 +08:00
去看下 lodash 怎么写的 deepcopy
sneezry
2018-02-10 13:50:24 +08:00
如果只考虑数组和对象的话,有个很 tricky 的办法

newObj = JSON.parse(JSON.stringify(obj))

递归的话最底层是基本类型,string 啊 number 啊 boolean 啊 null 啊什么的,如果是这些类型 copy 要返回数据本身。
Cbdy
2018-02-10 18:21:14 +08:00
单层次的
对象
const t = { ...s }
数组
const t = [ ...s ]
bumz
2018-02-10 19:18:36 +08:00
bumz
2018-02-10 19:20:41 +08:00
简单地说,深拷贝等价于遍历树,不用递归就是 non-recursive tree traversal
bumz
2018-02-10 19:21:32 +08:00
不过这个假设对象有循环引用就不行了,需要加一个判回
onyourroad
2018-02-11 10:02:11 +08:00
@bumz 谢谢了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/429938

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX