JSON删除还会删除源变量中的属性
JSON delete deletes attribute in source variable also
我有一个小问题。
var template = data;
delete template.candidates;
上述代码也删除了data.candidates
。尽管我可以用其他逻辑来解决它。但我需要它背后的实际原因和适当的解决方案(而不是变通方法)。
提前感谢
=
只创建Object的引用。为了克隆(这是您的要求),您可以执行以下
ES2015(ES6)-
var template = Object.assign({}, data);
ES5-
var template = JSON.parse(JSON.stringify(data));
这两个选项都将在名为template
的新变量中克隆对象。现在,下一个操作将只是从模板中删除数据,保持data
的完整性。
发生这种情况的原因是将对data
的引用传递给变量template
。解决这个"问题"的一个简单方法是通过如下操作来克隆对象:
var template = JSON.parse(JSON.stringify(data))
当您将Object分配给变量时,变量实际上并不"包含"Object(就像整数的情况一样),变量只包含对Object的引用。因此,通过分配var template = data
,实际上并没有将data
复制到template
中,只是将引用复制到了template
正在引用的对象。因此,现在有两个变量,引用同一个Object,因此对其中任何一个变量执行任何操作都会影响同一个对象。因此,解决方案是实际将对象从data
克隆到template
您需要在模板var:中创建对象的副本
var data = {
candidates: [1, 2],
test: [1]
};
var template = data.constructor();
for (var attr in data) {
if (data.hasOwnProperty(attr)) template[attr] = data[attr];
}
delete template.candidates;
console.log(data, template);
您遇到的问题是可变性问题,在您的代码中,数据和模板实际上引用了同一个对象,因此对其中一个对象的更改将影响另一个对象。您应该努力避免变量发生突变,而是在需要更改变量时返回一个新对象。您需要使用Object.assign()
或排列运算符。另一个问题是,没有正确的方法从JS中删除对象键——您使用的delete
函数实际上相当慢。
const jsonFunction = input => {
return {
...input,
candidates: null,
...input
}
};
const data = jsonFunction(template);
或者与CCD_ 16 交替使用
const jsonFunction = input => {
return Object.assign({}, input, candidates: null);
}
const data = jsonFunction(template);
这将返回一个新对象并将其分配给数据,通过对其进行免疫处理,这意味着您可以处理data
和template
而不会相互影响。
- 在不知道深度或父属性的情况下从对象中删除属性
- 如何从对象中删除属性
- 使用jQuery添加和删除属性
- 为什么没有从数组中存在的对象中删除属性
- 删除属性后刷新DOM,而不象chrome那样刷新页面
- Jquery 在当前之前从元素中删除属性
- 在窗口调整大小时删除属性
- 如何从使用 jquery 添加的项中删除属性
- 从 JavaScript 中的 XAML 元素中删除属性
- 主干模型.未设置不删除属性
- 无法在单击时添加/删除属性
- 从主干.js模型中删除属性
- 如果选中复选框,请删除属性
- jQuery单击功能可从元素中删除属性并在单独单击时恢复属性
- 如果找到特定类,如何添加和删除属性
- 如何使用 Javascript 从 DOM 元素中删除属性
- 从 Javascript 对象中删除属性
- 量角器未知错误,从 DOM 中删除属性
- 如何使用jquery onchange事件在HTML中添加和删除属性
- 如何从任何级别的嵌套javascript对象中删除属性