繁体   English   中英

如何使用变量进行推送?

[英]How can I make a push with a variable?

您好,我在 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);

你得到最后一个赋值的原因是因为在 JavaScript 中,对象是通过引用传递的。 您可以克隆它并将克隆推送到阵列。 您可以使用Object.assign()进行克隆,但考虑到对象的复杂性,我认为这还不够,因为Object.assign()只会浅层克隆您的对象。 我只能建议使用 lodash 进行深度克隆

Object.assign()

您已将相同的变量ParamsSingleStat分配给PanelConfStatusPanelAppStatus 由于 JS 是通过引用调用的,因此您实际上是在两次更新相同的变量。 您必须使用 JSON.parse 或类似文件来创建副本。 例如:

var PanelConfStatus = JSON.parse(JSON.stringify(ParamsSingleStat));
var PanelAppStatus = JSON.parse(JSON.stringify(ParamsSingleStat));

这将为您提供不同的值。

问题是你在最后改变了值,因此 prev 值也改变了。

可以使用 object spread 来获取 ParamsSingleStat 的新对象,然后对其进行变异

 var PanelConfStatus = {...ParamsSingleStat};
 var PanelAppStatus = {...ParamsSingleStat};

您需要克隆 ParamsSingleStat 对象,否则 PanelConfStatus 和 PanelAppStatus 将成为指向同一对象的引用,因此当您更改一个对象时,您也会更改“另一个”。 var 赋值应该是这样的:

var PanelConfStatus = Object.assign({}, ParamsSingleStat);
var PanelAppStatus = Object.assign({}, ParamsSingleStat);

我敢肯定还有很多其他方法可以做到这一点,这是我当场想到的,但是您可以搜索对象克隆。

另外,值得注意的是,建议使用 let 而不是 var (除非您不打算转译您的代码;尽管大多数现代浏览器都接受 let,但我希望)

那是因为您使用对象引用,您需要使用以下内容:

 var PanelConfStatus = Object.assign({}, ParamsSingleStat);
 var PanelAppStatus =  Object.assign({}, ParamsSingleStat);

您的变量PanelConfStatusPanelAppStatus指向来自ParamsSingleStat的相同值实例。 这是从以下几行完成的:

var PanelConfStatus = ParamsSingleStat;
var PanelAppStatus = ParamsSingleStat;

而不是上面的代码。 创建ParamsSingleStat的副本/克隆。 例如,使用Object.assign({}, yourObjectToCopy) 用这个替换上面的两行:

var PanelConfStatus = Object.assign({}, ParamsSingleStat);
var PanelAppStatus = Object.assign({}, ParamsSingleStat);

这样,您的变量将拥有自己的对象副本,并且可以独立修改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM