Javascript JSON delete还删除源变量中的属性
我有个小问题Javascript JSON delete还删除源变量中的属性,javascript,json,Javascript,Json,我有个小问题 var template = data; delete template.candidates; 上述代码删除数据。候选人也删除。 虽然我可以用其他的逻辑来解决。但我需要它背后的实际原因和适当的解决方案(不是解决办法) 提前感谢默认情况下=只创建对象的引用。为了克隆(这是您的要求),您可以执行以下操作 ES2015(ES6)- ES5- 这两个选项都将在名为template的新变量中克隆对象。现在,下一个操作将只从模板中删除数据,保持数据完好无损。默认情况下=仅创建对象的引用。为
var template = data;
delete template.candidates;
上述代码删除数据。候选人也删除。
虽然我可以用其他的逻辑来解决。但我需要它背后的实际原因和适当的解决方案(不是解决办法)
提前感谢默认情况下=
只创建对象的引用。为了克隆(这是您的要求),您可以执行以下操作
ES2015(ES6)-
ES5-
这两个选项都将在名为template
的新变量中克隆对象。现在,下一个操作将只从模板中删除数据,保持数据
完好无损。默认情况下=
仅创建对象的引用。为了克隆(这是您的要求),您可以执行以下操作
ES2015(ES6)-
ES5-
这两个选项都将在名为template
的新变量中克隆对象。现在,下一个操作将只是从模板中删除数据,保持数据
完好无损。发生这种情况是因为您正在将对数据
的引用传递给变量模板
。解决此“问题”的一个简单方法是通过如下操作克隆对象:
var template=JSON.parse(JSON.stringify(data))
发生这种情况是因为您正在将对数据的引用传递给变量template
。解决此“问题”的一个简单方法是通过如下操作克隆对象:
var template=JSON.parse(JSON.stringify(data))
您需要在模板var中创建对象的副本:
var数据={
候选人:[1,2],
测试:[1]
};
var template=data.constructor();
for(数据中的var attr){
如果(data.hasOwnProperty(attr))模板[attr]=data[attr];
}
删除模板.候选项;
console.log(数据、模板)代码>您需要在模板变量中创建对象的副本:
var数据={
候选人:[1,2],
测试:[1]
};
var template=data.constructor();
for(数据中的var attr){
如果(data.hasOwnProperty(attr))模板[attr]=data[attr];
}
删除模板.候选项;
console.log(数据、模板)代码>将对象分配给变量时,变量实际上并不“包含”对象(就像整数一样),变量只包含对对象的引用。
因此,通过分配var template=data
您实际上并没有将数据
复制到模板
中,您只是将引用复制到模板
正在引用的对象。因此,您现在有两个变量,引用同一对象,因此对这些变量中的任何一个执行任何操作都将影响同一对象。
因此,解决这个问题的方法是将对象从数据
克隆到模板
当您将对象分配给变量时,变量实际上并不“包含”对象(就像整数一样),变量只包含对对象的引用。
因此,通过分配var template=data
您实际上并没有将数据
复制到模板
中,您只是将引用复制到模板
正在引用的对象。因此,您现在有两个变量,引用同一对象,因此对这些变量中的任何一个执行任何操作都将影响同一对象。
因此,解决方法是将对象从数据
克隆到模板
您遇到的问题是可变性问题,在您的代码中,数据和模板实际上引用同一对象,因此对其中一个对象的更改将影响另一个对象。您应该努力不改变变量,而是在需要更改变量时返回一个新对象。您需要使用对象.assign()
或spread运算符。另一个问题是,没有正确的方法从JS中删除对象键。您使用的delete
函数实际上相当慢
const jsonFunction = input => {
return {
...input,
candidates: null,
...input
}
};
const data = jsonFunction(template);
或者使用Object.assign()
这将返回一个新对象并将其分配给数据,通过不可变地处理它,这意味着您可以处理数据
和模板
,而不会相互影响。您遇到的问题是一个易变性问题,在代码中,数据和模板实际上引用同一个对象,因此对其中一个对象的更改将影响另一个对象。您应该努力不改变变量,而是在需要更改变量时返回一个新对象。您需要使用对象.assign()
或spread运算符。另一个问题是,没有正确的方法从JS中删除对象键。您使用的delete
函数实际上相当慢
const jsonFunction = input => {
return {
...input,
candidates: null,
...input
}
};
const data = jsonFunction(template);
或者使用Object.assign()
这将返回一个新对象并将其分配给数据,通过不可变地处理它,这意味着您可以处理数据
和模板
,而不会相互影响。您必须复制该对象-请看这里:请看您必须复制该对象-请看这里:请看谢谢@Bikas,这对Hanks@Bikas很有帮助
const jsonFunction = input => {
return {
...input,
candidates: null,
...input
}
};
const data = jsonFunction(template);
const jsonFunction = input => {
return Object.assign({}, input, candidates: null);
}
const data = jsonFunction(template);