Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON delete还删除源变量中的属性_Javascript_Json - Fatal编程技术网

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