【问题标题】:ECMAScript5 deep copy of object and arrays对象和数组的 ECMAScript5 深拷贝
【发布时间】:2011-12-26 21:53:23
【问题描述】:

我希望找到一个示例代码来对 ECMAScript5 中的对象进行深度复制。

复制应该可以克隆

  • 嵌套对象

  • 嵌套数组

  • 数组中的嵌套对象(单独克隆每个数组项)

注意:jQuery.extend() 似乎无法处理案例 3)。另外,我希望在干净的 ECMAScript 中做到这一点。快速谷歌搜索并没有找到任何有价值的实现。

【问题讨论】:

  • 深拷贝是一个很重要的问题,我建议你改变你的算法,让它适用于浅拷贝
  • 目前我正在使用 jQuery.extend() 并在之后手动清理混乱

标签: javascript associative-array deep-copy ecmascript-5 object-object-mapping


【解决方案1】:

我最终选择了jQuery.extend(),因为我找不到其他好的实现

http://api.jquery.com/jQuery.extend/

【讨论】:

    【解决方案2】:

    使用toSource methodemulation 复制对象:

        <script type="text/javascript">
        Object.prototype.getSource = function() {
          var output = [], temp;
          for (var i in this) {
              if (this.hasOwnProperty(i)) {
                  temp = i + ":";
                  switch (typeof this[i]) {
                      case "object" :
                          temp += this[i].getSource();
                          break;
                      case "string" :
                          temp += "\"" + this[i] + "\"";    // add in some code to escape quotes
                          break;
                      default :
                          temp += this[i];
                  }
                  output.push(temp);
              }
          }
          return "{" + output.join() + "}";
          }
          var baz = {"alpha":{"beta":{"charlie": ["delta","epsilon",{"omega":"zeta"}]}}};
          !!Object.prototype.toSource ? alert((baz).toSource() ) : alert((baz).getSource() );
        </script>
    

    【讨论】:

    • 一个开始,但这不是很脆弱.. 可能带有循环引用的无限循环?
    • Contact the developer of this solution 寻求健壮性帮助。
    【解决方案3】:

    如果你想要一个单线(通过迭代引用的对象来检索原语来删除对象引用,连接一个大字符串,然后用它自己的原始叶节点将字符串解析成一个新对象)

    JSON.parse(JSON.stringify(obj))
    

    或者如果您需要执行许多副本

    function deepCopy(o) {
        var copy = o,k;
    
        if (o && typeof o === 'object') {
            copy = Object.prototype.toString.call(o) === '[object Array]' ? [] : {};
            for (k in o) {
                copy[k] = deepCopy(o[k]);
            }
        }
    
        return copy;
    }
    

    performance comparison

    【讨论】:

    • 什么意思?这确实执行了深层复制。它不是专门的 ECMAScript5,但 jQuery 也不是吗?
    • 对不起!我的意思是请解释一下代码在做什么?
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2021-05-27
    • 2015-09-14
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2016-12-03
    相关资源
    最近更新 更多