![](/img/trans.png)
[英]Javascript getComputedStyle - copy object without reference
[英]How to copy json object without reference in vue?
在我的组件中,我声明了一些这样的数据:
data() {
return {
defaultValue: {json object with some structure},
activeValue: {}
...
并在组件方法中复制此值:
this.activeValue = this.defaultValue
但问题是,在更改this.activeValue
值后, this.defaultValue
也发生了变化。
如果我使用Object.freeze(this.defaultValue)
并尝试更改this.activeValue
我得到错误 - object 不可写。
我如何复制数据但没有参考?
如果你有简单的 object,最快最简单的方法就是使用 JSON.parse 和 JSON.stringify;
const obj = {};
const objNoReference = JSON.parse(JSON.stringify(obj));
this.activeValue = { ...this.defaultValue }
如果您没有嵌套的 object,使用 ES6 扩展运算符将帮助您进行复制。 如果使用等号 = 等号,它不会创建新的 object,它只会创建一个引用当前 object 的变量(如浅拷贝)。
做一个完整的深拷贝,即使它是嵌套的 object, go :
const objNoReference = JSON.parse(JSON.stringify(obj));
正如猫头鹰所建议的那样。
比使用 JSON.parse, JSON.stringify 更好的方法是:
this.activeValue = {...this.defaultValue}
但某些浏览器 (IE) 本身并不支持此功能,除非与转译器 (babel) 一起使用
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
更新
考虑到您最初的问题是关于 Vue 中的一种方式,vue 中还有一个本机方法:
this.activeValue = Vue.util.extend({}, this.defaultValue)
希望这可以帮助!
您可以使用 'JSON.parse and stringify' 或在lodash (下划线、ramda ...)
对象是通过引用分配和复制的。
所有通过复制引用的操作(如添加/删除属性)都在同一个 object 上执行。
要制作“real copy”
(克隆),我们可以使用Object.assign
进行所谓的“shallow copy”
(嵌套对象通过引用进行复制)。
对于“deep cloning”
,请使用loadash库中的 _.cloneDeep(obj)。
还有一个简单的解决方案是将defaultValue: {json object with some structure}
与JSON.stringify(defaultValue)
在字符串变量中:
var x = JSON.stringify(this.defaultValue);
如果您再次需要它为 JSON object,您可以使用 JSON.parse() 获得它:
var newObject = JSON.parse(x);
object 参考也被破坏了,如果defaultValue
值的内容被更改, x
将保持不变。
JSON stringify&parse 方法存在一些问题,例如将日期对象转换为字符串。 它也不能处理特殊的数据类型,如Map
、 Set
、 function
等......这很容易出现未来的错误。
我使用下面的方法来深拷贝一个 object。
记住! 这不是克隆的完整应用。 还有更多的数据类型需要处理,比如Blob
、 RegExp
等......
const deepClone = (inObject) => {
let outObject, value, key
if (typeof inObject !== "object" || inObject === null)
return inObject
if (inObject instanceof Map) {
outObject = new Map(inObject);
for ([key, value] of outObject)
outObject.set(key, deepClone(value))
} else if (inObject instanceof Set) {
outObject = new Set();
for (value of inObject)
outObject.add(deepClone(value))
} else if (inObject instanceof Date) {
outObject = new Date(+inObject)
} else {
outObject = Array.isArray(inObject) ? [] : {}
for (key in inObject) {
value = inObject[key]
outObject[key] = deepClone(value)
}
}
return outObject
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.