ECMAScript5深拷贝对象和数组

3
我希望能找到一个ECMAScript5深拷贝对象的示例代码。
拷贝应该能够克隆:
- 嵌套对象 - 嵌套数组 - 数组中嵌套的对象(单独克隆每个数组项)
注意:jQuery.extend()似乎不能处理第3种情况。此外,我希望在干净的ECMAScript中实现这一点。快速搜索没有找到任何值得称赞的实现。

深度复制是一个非常棘手的问题,我建议您更改算法,使其能够使用浅拷贝。 - Raynos
目前我正在使用jQuery.extend()方法,然后手动清理之后的混乱。 - Mikko Ohtamaa
3个回答

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

性能比较


你是什么意思?这确实执行了深拷贝。它不是特定于ECMAScript5,但jQuery也不是对吧? - neaumusic
抱歉!我的意思是请解释一下这段代码在做什么? - Saifur

0

使用仿真 toSource 方法来复制对象:

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

一个开始,但这不是有点脆弱吗..可能会出现循环引用的无限循环? - Mikko Ohtamaa
请联系此解决方案的开发人员(http://stackoverflow.com/users/9021/nickf)以获取有关稳健性的帮助。 - Paul Sweatte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接