我已经在这里浏览了一段时间,但仍然没有找到适用于我的答案。
在JS中有没有办法深复制非平面对象?
我尝试过jQuery.extend(true, {}, this)
,但它只克隆了其中的一部分,其余部分仍然作为对另一个对象的引用。
我已经在这里浏览了一段时间,但仍然没有找到适用于我的答案。
在JS中有没有办法深复制非平面对象?
我尝试过jQuery.extend(true, {}, this)
,但它只克隆了其中的一部分,其余部分仍然作为对另一个对象的引用。
下面介绍三种不同的复制对象的方法。每种方法都有优缺点,所以请仔细阅读并选择最适合你情况的方法。
使用 Object.assign
方法,它 "用于将一个或多个源对象的可枚举属性的值复制到目标对象中"。这将复制值和函数。截至撰写本文时,浏览器支持程度良好但不完美,但在我看来这是三种方法中最好的一种。
const obj1 = {a:1, b:2};
const obj1Copy = Object.assign(obj1)
另外,您可以使用扩展操作符从一个对象展开到另一个对象。请注意,这将复制键的值,但如果某个键的值是内存地址(另一个嵌套对象或数组),则只会进行浅拷贝。
const obj1 = {a: () => {}, b:2}
const obj1Copy = { ...obj1 }
如果对象没有任何循环引用或函数作为值,您可以使用json.stringify技巧:
let myCopy = JSON.parse(JSON.stringify(myObject));
无需使用任何库,对大多数对象都能很好地工作。
myObject
中工作吗? - guest271314var obj = {"0":function(){}}
,其中 "0"
是属性,obj["0"]
的值是 function(){}
。或者这个例子的解释不正确吗?“克隆文档或窗口?绝对不寻常。”对于某些项目可能会有用,可以参考这个答案在编辑、保存、自修改HTML文档;格式化生成的HTML、JavaScript。 - guest271314var objects = [{ 'a': 1 }, { 'b': 2 }];
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false
const cloned = structuredClone(object)
无论如何,structuredClone 还允许您执行其他可能感兴趣的操作。
请查看文档以获取更多详细信息:
https://developer.mozilla.org/en-US/docs/Web/API/structuredClone
JSON.parse(JSON.stringify({"foo":"bar"}))
性能如何? >> [ 也许这是深度复制对象的最佳方法 ]。我强烈建议您查看来自Google Chrome Developers社区在Youtube上的视频,解释了这种方法的工作原理和性能基准。
注意:如果您的对象没有包含日期、函数、未定义、无限大、正则表达式、映射、集合、Blob、FileList、ImageData、稀疏数组、类型化数组或其他复杂类型,请使用
JSON.parse
方法。 来源:阅读此SO答案
小贴士 - React.JS 的初始状态树可以使用这个解决方案从 localStorage 中加载。
JSON.stringify/parse
始终创建一个普通对象,剥离原始对象中可能存在的任何自定义方法。要在 stringify/parse 后将方法还原到副本中,请使用 Object.setPrototypeOf(copy, Object.getPrototypeOf(original))
。 - terrymorse// myObject constructor
function myObject(foo, bar){
this.foo = foo
this.bar = bar
}
// delegate the functions to a prototype
myObject.prototype.something = function(){
console.log('something')
}
function instanceCopy(obj) {
// copy the object by the constructor
const copy = new obj.constructor()
const keys = Object.keys(obj)
keys.forEach(key => {
copy[key] = obj[key]
})
return copy
}
const myObj = new myObject('foo', 'bar')
const copyObj = instanceCopy(myObj)
console.log('myObj', myObj)
console.log('copyObj', copyObj)
console.log('same ?', copyObj === myObj)
// can we still call the functions
copyObj.something()
<script src="https://codepen.io/synthet1c/pen/WrQapG.js"></script>
Lodash _.cloneDeep() 方法会影响应用程序的性能。因此,我想出了一个基本的 JavaScript 解决方案,并将其添加到了我的 GIT 存储库中。使用我的解决方案后,我的应用程序性能恢复正常。
https://github.com/manideeppabba1991/javascript_util_functions/blob/master/clone_Array_or_Object.js
JSON.parse(JSON.stringify(...))
这个技巧。 - Akshat Mahajan