ECMAScript5对象和数组的深层副本

时间:2011-11-11 10:17:13

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

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

复制应该能够克隆

  • 嵌套对象

  • 嵌套数组

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

使用emulationtoSource method复制对象:

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