首页 > 解决方案 > 数组的值在更新属性值时更新

问题描述

我在 JS 文件中有以下代码

    var listOfCountries = [];
    var Country = {};
    Country = { "CountryCode": null, "SerialNo": 0, "FrzInd": false }

    for (var i=0; i < $('#ulCustomCountryList li').length; i++) {
      Country.CountryCode = $("#countryCode_" + i).val();
      Country.SerialNo = $("#serialNo_" + i).val();
      listOfCountries.push(Country);
    }

在第一次迭代中:当 countryCode_0 为“IND”listOfCountries[0].CountryCode = "IND"时,在第二次迭代中,当 countryCode_1 为“AUS”时listOfCountries[1].CountryCode = "AUS",它还将 listOfCountries[0].CountryCode 的值更新为listOfCountries[0].CountryCode = "AUS"

标签: javascriptjquery

解决方案


因为对象是参考。所有对对象的引用都将被更新。你每次迭代都推送同一个对象,所以你有两种方法来修复它

1-在每次迭代时创建新对象如下:

  var countriesCount = $('#ulCustomCountryList li').length; //- 1
  listOfCountries =[];
  for (var i = 0; i < countriesCount; i++) {

    var Country = { "CountryCode": null, "SerialNo": 0, "FrzInd": false }
    Country.CountryCode = $("#countryCode_" + i).val();
    Country.SerialNo = $("#serialNo_" + i).val();
    listOfCountries.push(Country);

  }

或 2 -Object.assign({},Country)用于每次迭代复制对象。

     var countriesCount = $('#ulCustomCountryList li').length; //- 1
       var listOfCountries = [];
        var Country = {};
        Country = { "CountryCode": null, "SerialNo": 0, "FrzInd": false }

        for (var i=0; i < countriesCount; i++) {
          var copy = Object.assign({}, Country);
          copy.CountryCode = $("#countryCode_" + i).val();
          copy.SerialNo = $("#serialNo_" + i).val();
          listOfCountries.push(copy);
        }

推荐阅读