JSON删除还会删除源变量中的属性

JSON delete deletes attribute in source variable also

本文关键字:删除 属性 变量 JSON      更新时间:2023-12-05

我有一个小问题。

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);

这将返回一个新对象并将其分配给数据,通过对其进行免疫处理,这意味着您可以处理datatemplate而不会相互影响。