如何使用变量进行推送?

时间:2019-03-01 08:07:35

标签: javascript arrays

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

6 个答案:

答案 0 :(得分:1)

获得最后一个分配的原因是因为在JavaScript中,对象是通过引用传递的。您可以克隆它,并将克隆推到阵列中。您可以使用did进行克隆,但是考虑到对象的复杂性,我认为这还不够,因为did仅会浅化克隆对象。我只能建议使用lodash进行深度克隆

Object.assign()

答案 1 :(得分:0)

您已为ParamsSingleStatPanelConfStatus分配了相同的变量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)

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

var PanelConfStatus = ParamsSingleStat;
var PanelAppStatus = ParamsSingleStat;

代替上面的代码。创建{/ {1}}的副本/副本。例如,使用ParamsSingleStat。替换上面的两行:

Object.assign({}, yourObjectToCopy)

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