JSON删除也删除源变量中的属性

时间:2016-04-04 13:23:47

标签: javascript json

我有一个小问题。

var template = data;
delete template.candidates;

上述代码也会删除data.candidates。 虽然我可以通过其他一些逻辑解决它。但我需要它背后的实际原因和适当的解决方案(不是解决方法)。

提前致谢

5 个答案:

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

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