【问题标题】:most performant way to deep copy objects javascript深度复制对象javascript的最高效方法
【发布时间】:2018-11-10 03:38:08
【问题描述】:

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

var x = {a:9}, y:{a:{b:9}}, z = {a:{b:{c:9}}};

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

var newX = {...x}, newY = {a:{...y.a}}

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

var newZ = JSON.parse(JSON.stringify(z));

创建我的深层副本。

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

【问题讨论】:

标签: javascript json redux deep-copy


【解决方案1】:

如果你真的想要深度克隆,到目前为止,根据我的经验,最高效的方法是你已经提到的 JSON 解析/字符串化技巧。

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

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

【讨论】:

    【解决方案2】:

    我使用 StackOverflow 上某处的这个函数:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 2012-07-03
      • 2021-03-20
      相关资源
      最近更新 更多