您好,我在JavaScript中使用方法push时遇到问题。我要推送一个对象,每次推送时,我只会更改该对象的某些属性。我的问题是,当我查看数组时,会给我一个带有最后一个赋值属性的对象数组。
这时,当我查看变量Panel时,将得到两个具有相同值的位置的数组。这个值是我最后一次分配的对象。
var ARGS = { "var-Instalation":"vi"};
var Panel = new Array();
var ParamsSingleStat = {
"datasource": "influxdb",
"targets": [{
"groupBy": [],
"measurement": "mqtt_consumer",
"select": [
[{
"params": [
"value"
],
"type": "field"
}]
],
"tags": [{
"key": "topic",
"operator": "=",
"value": ""
}]
}],
"title": "",
"type": "singlestat",
}
var PanelConfStatus = ParamsSingleStat;
var PanelAppStatus = ParamsSingleStat;
PanelAppStatus.targets[0].tags[0].value = "Instalacion/" + ARGS["var-Instalation"] + "/ECCE/EstadoApp"
PanelAppStatus.title = "Estado Aplicacion"
Panel.push(PanelAppStatus);
console.log(Panel)
PanelConfStatus.targets[0].tags[0].value = "Instalacion/" + ARGS["var-Instalation"] + "/ECCE/EstadoConfiguracion"
PanelConfStatus.title = "Estado Configuracion"
Panel.push(PanelConfStatus);
答案 0 :(得分:1)
获得最后一个分配的原因是因为在JavaScript中,对象是通过引用传递的。您可以克隆它,并将克隆推到阵列中。您可以使用did
进行克隆,但是考虑到对象的复杂性,我认为这还不够,因为did
仅会浅化克隆对象。我只能建议使用lodash进行深度克隆
答案 1 :(得分:0)
您已为ParamsSingleStat
和PanelConfStatus
分配了相同的变量PanelAppStatus
。由于JS是通过引用调用的,因此实际上您将同一变量更新了两次。您必须使用JSON.parse或类似文件来创建副本。
例如:
var PanelConfStatus = JSON.parse(JSON.stringify(ParamsSingleStat));
var PanelAppStatus = JSON.parse(JSON.stringify(ParamsSingleStat));
这将为您提供不同的值。
答案 2 :(得分:0)
问题是您在最后更改了值,因此prev值也被更改了。
您可以使用对象传播来获取ParamsSingleStat的新对象,然后对其进行变异
var PanelConfStatus = {...ParamsSingleStat};
var PanelAppStatus = {...ParamsSingleStat};
答案 3 :(得分:0)
您需要克隆ParamsSingleStat对象,否则PanelConfStatus和PanelAppStatus将是指向同一对象的引用,因此,在更改一个对象时,也要更改“另一个”。 var分配应如下所示:
var PanelConfStatus = Object.assign({}, ParamsSingleStat);
var PanelAppStatus = Object.assign({}, ParamsSingleStat);
我敢肯定还有很多其他方法可以做到这一点,这是我当场提出的,但是您可以搜索对象克隆。
另外,值得注意的是,建议使用let代替var(除非您不打算转换代码;尽管大多数现代浏览器都接受let,但我希望如此)
答案 4 :(得分:0)
那是因为使用对象引用时需要使用以下内容:
var PanelConfStatus = Object.assign({}, ParamsSingleStat);
var PanelAppStatus = Object.assign({}, ParamsSingleStat);
答案 5 :(得分:0)
您的变量PanelConfStatus
和PanelAppStatus
指向ParamsSingleStat
中值的相同实例。这是从以下行完成的:
var PanelConfStatus = ParamsSingleStat;
var PanelAppStatus = ParamsSingleStat;
代替上面的代码。创建{/ {1}}的副本/副本。例如,使用ParamsSingleStat
。替换上面的两行:
Object.assign({}, yourObjectToCopy)
这样,您的变量将拥有对象的自己的副本,并且可以独立进行修改。