ECMAScript5 deep copy of object and arrays
我希望能找到一个示例代码来对ecmascript5中的对象进行深度复制。
复制应该能够克隆
嵌套对象
嵌套数组
数组中的嵌套对象(分别克隆每个数组项)
注意:jquery.extend()似乎不处理案例3)。另外,我希望用干净的ecmascript来做这个。快速搜索并没有带来任何有价值的实现。
如果需要一个一行程序(通过迭代引用的对象来检索基元来删除对象引用,连接一个大字符串,然后使用它自己的基元叶节点将该字符串解析为一个新对象)
1 | JSON.parse(JSON.stringify(obj)) |
或者如果你需要做很多拷贝
1 2 3 4 5 6 7 8 9 10 11 12 | 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; } |
性能比较
我最终决定使用
http://api.jquery.com/jquery.extend/
使用tosource方法的仿真来复制对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <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() ); |