我有一个小问题。
var template = data;
delete template.candidates;
上述代码也会删除data.candidates
。
虽然我可以通过其他一些逻辑解决它。但我需要它背后的实际原因和适当的解决方案(不是解决方法)。
提前致谢
答案 0 :(得分:2)
默认情况下=
仅创建Object的引用。为了克隆(这是您的要求),您可以执行以下操作
ES2015(ES6) -
var template = Object.assign({}, data);
ES5 -
var template = JSON.parse(JSON.stringify(data));
两个选项都将在名为template
的新变量中克隆对象。现在,下一个操作只会删除保留data
的模板中的数据。
答案 1 :(得分:1)
这是因为您将对data
的引用传递给变量template
。解决这个问题的简单方法"是通过这样做来克隆对象:
var template = JSON.parse(JSON.stringify(data))
答案 2 :(得分:1)
当您将一个Object分配给一个变量时,该变量实际上并不包含"对象(就像是一个整数的情况),变量只包含对Object的引用。
因此,通过指定var template = data
您实际上并未将data
复制到template
,您只是复制对象template
的引用正在引用。因此,您现在有两个变量,引用相同的Object,因此对任何这些变量执行任何操作,都会影响同一个Object。
因此,对此的解决方案是将对象实际从data
克隆到template
答案 3 :(得分:0)
您需要在模板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);

答案 4 :(得分:0)
您遇到的问题是可变性问题,在您的代码数据和模板中实际引用相同的对象,因此更改为一个会影响另一个。您应该努力不改变变量,而是在需要使用它们进行更改时返回新对象。您将要使用Object.assign()
或点差运算符。另一个问题是因为没有正确的方法从JS删除对象键,你使用的delete
函数实际上很慢。
const jsonFunction = input => {
return {
...input,
candidates: null,
...input
}
};
const data = jsonFunction(template);
或Object.assign()
const jsonFunction = input => {
return Object.assign({}, input, candidates: null);
}
const data = jsonFunction(template);
这将返回一个新对象,并将其分配给数据,通过不可变地处理它,这意味着您可以处理data
和template
,而不会相互影响。