首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最有效的深度复制对象的方法

最有效的深度复制对象的方法
EN

Stack Overflow用户
提问于 2018-11-10 11:38:09
回答 2查看 528关注 0票数 0

我想在javascript中深度复制一些对象,这样我的reducer在redux中就是纯的。有些属性有1层嵌套,有些属性有2层嵌套,有些属性有3层嵌套,例如:

代码语言:javascript
复制
var x = {a:9}, y:{a:{b:9}}, z = {a:{b:{c:9}}};

所以我应该使用一些其他的技术,比如:

代码语言:javascript
复制
var newX = {...x}, newY = {a:{...y.a}}

我应该继续在循环中使用相同的技术--也为3层嵌套编写我的自定义深度副本,或者我应该简单地使用:

代码语言:javascript
复制
var newZ = JSON.parse(JSON.stringify(z));

来创建我的深度副本。

JSON.parse(JSON.stringify(Value))最快的替代方法是什么??

EN

回答 2

Stack Overflow用户

发布于 2018-11-10 12:03:53

如果您真的想要深度克隆,根据我的经验,到目前为止性能最好的方法是您已经提到的JSON解析/stringify技巧。

否则,您将不得不退回到某种递归克隆策略。以Lodash has a deepClone function为例。

作为深度克隆的替代方案,我强烈推荐immer,它利用了一种称为结构共享的概念,在这种概念中,对象的未更改部分不会被克隆。这是更高的性能和使用更少的内存。

票数 0
EN

Stack Overflow用户

发布于 2018-11-10 12:54:22

我使用在StackOverflow上的某个地方找到的函数:

代码语言:javascript
复制
const deepCopy = origin => {
  let cp;
  switch (typeof origin) {
    case 'object':
      if (origin === null) {
        cp = null;
      } else {
        switch (toString.call(origin)) {
          case '[object Array]':
            cp = origin.map(deepCopy);
            break;
          case '[object Date]':
            cp = new Date(origin);
            break;
          case '[object ReqExp]':
            cp = new RegExp(origin);
            break;

          default:
            cp = Object.keys(origin).reduce((prev, key) => {
              prev[key] = deepCopy(origin[key]);
              return prev;
            }, {});
            break;
        }
      }
      break;

    default:
      cp = origin;

  }
  return cp;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53235802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档