【发布时间】:2021-04-05 18:33:13
【问题描述】:
我在 Vue 实例中有一个 JavaScript 对象,它通过计算属性被深度复制到另一个 JavaScript 对象中。然而由于某种原因,它浅拷贝了有问题的对象而不是深拷贝,即使正在使用JSON.parse(JSON.stringify()):
<div id="app">
<v-app id="inspire">
<v-row>
<v-col cols="6">
<v-text-field
v-model="formDialog.inputs.definition.val"
placeholder="Definition from FormDialog"></v-text-field>
</v-col>
<v-col cols="6">
<v-text-field
v-model="initFields.definition"
placeholder="Definition from Init Fields"></v-text-field>
</v-col>
</v-row>
<v-row>
<v-col cols="6">
<v-text-field
v-model="formDialog.inputs.synonym.val"
placeholder="Synonym from FormDialog"></v-text-field>
</v-col>
<v-col cols="6">
<v-text-field
v-model="initFields.synonym"
placeholder="Synonym from Init Fields"></v-text-field>
</v-col>
</v-row>
</v-app>
</div>
我正在尝试使用计算属性中的以下循环深度复制 formDialog.inputs 的值:
new Vue({
el: '#app',
vuetify: new Vuetify(),
data () {
return {
formDialog: {
inputs: {
definition: {
val: '', save: true, add: true,
icon: 'mdi-file-word',
placeholder: 'Word Definition'
},
synonym: {
val: '', save: true, add: true,
placeholder: 'Synonyms'
}
}
}
}
},
computed: {
initFields: function() {
let obj = {};
if(typeof this.formDialog.inputs != 'undefined') {
for(let key of Object.keys(this.formDialog.inputs)) {
if(typeof this.formDialog.inputs[key].val != 'undefined') {
//obj[key] = JSON.parse(JSON.stringify(this.formDialog.inputs[key]));
obj[key] = this.formDialog.inputs[key].val;
}
}
}
return JSON.parse(JSON.stringify(obj));
//return obj;
}
}
})
然而,obj 对象保留了this.formDialog.inputs 对象的浅拷贝,而我希望它对其进行深层拷贝。为什么即使我使用JSON.parse(JSON.stringify(obj)),它也没有创建对象的深层副本?
【问题讨论】:
-
您认为这是浅拷贝的原因是什么?使用
JSON.parse从字符串创建新对象不可能导致浅拷贝。不是我不相信你,我肯定和你一样困惑。我只是好奇你是如何确认你的副本实际上很浅的。 -
注意所有
val属性值都是空字符串,所以调用JSON.parse(JSON.stringify(''))会返回空字符串,或者和浅拷贝一样的值... -
obj对象中的元素仍然保留对this.formDialog.inputs元素的引用。当我修改this.formDialog.inputs时,它也会修改obj元素。
标签: javascript vue.js object deep-copy