使用Javascript - 在使用...通过一个对象来迭代麻烦(Javascript - Tro

2019-06-26 16:26发布

我有一个动态生成的对象,看起来像这样:

colorArray = { 
    AR: "#8BBDE1", 
    AU: "#135D9E", 
    AT: "#8BBDE1",
    ... }

我试图用它通过对颜色的地图这个插件调用插件期间和“颜色”属性。 像这样:

$('#iniDensityMap').vectorMap({
    backgroundColor: '#c2e2f2',
    colors: colorArray,
    ... (some other params)
});

不过,这并不在国家的颜色。 当我硬编码在此,它工作正常 - 但它必须为这个项目是动态生成的,所以这样的事情会不会为我工作(尽管它其实颜色在地图一样):

$('#iniDensityMap').vectorMap({
    backgroundColor: '#c2e2f2',
    colors: { AR: "#8BBDE1", AU: "#135D9E", AT: "#8BBDE1" },
    ... (some other params)
});

我追踪的问题远远不够到插件找到它有事情做与此循环:

setColors: function(key, color) {
  if (typeof key == 'string') {
    this.countries[key].setFill(color);
  } else {

    var colors = key; //This is the parameter passed through to the plugin

    for (var code in colors) {

      //THIS WILL NOT GET CALLED

      if (this.countries[code]) {
        this.countries[code].setFill(colors[code]);
      }
    }
  }
},

我也试着通过迭代colorArray对象对我自己,对插件的外面,我遇到了同样的问题。 无论坐镇内线的for(OBJ中的变种x)的不点火。 我也注意到, colorArray.length返回undefined。 另外要注意的是,我已经实例化的var colorArray = {}; 在一个单独的电话,试图确保其坐在全球范围内,并且能够被操纵。

我想,这个问题可以是:

  1. 顺便我动态填充对象- colorArray[cCode] = cColor; (在一个jQuery。每个呼叫)
  2. 我再次混淆了JavaScript数组()和对象()之间的差异
  3. 这是一个范围的问题吧?
  4. 一切上述的一些组合。

编辑#1:我提出我关于在控制台Firebug的对象的其他问题一个新的职位这里 。 这个问题涉及更具体的萤火虫不是底层的JS问题我问这里。

编辑#2:其他信息下面是我使用的是动态填充对象的代码:

function parseDensityMapXML() {
$.ajax({
    type: "GET",
    url: "media/XML/mapCountryData.xml",
    dataType: "xml",
    success: function (xml) {
        $(xml).find("Country").each(function () {
            var cName = $(this).find("Name").text();
            var cIniCount = $(this).find("InitiativeCount").text();
            var cUrl = $(this).find("SearchURL").text();
            var cCode = $(this).find("CountryCode").text();

            //Populate the JS Object
            iniDensityData[cCode] = { "initiatives": cIniCount, "url": cUrl, "name": cName };
            //set colors according to values of initiatives count
            colorArray[cCode] = getCountryColor(cIniCount);
        });
    }
});
} //end function parseDensityMapXML();

然后,这个函数被调用页面上的其他复选框的Click事件。 对象iniDensityDatacolorArray在HTML文件的头部声明-希望让他们在全球范围内:

<script type="text/javascript">
    //Initialize a bunch of variables in the global scope
    iniDensityData = {};
    colorArray = {};
</script>

最后,这里是从XML文件中的一个片段正在读取:

<?xml version="1.0" encoding="utf-8"?>
<icapCountryData>
  <Country>
    <Name>Albania</Name>
    <CountryCode>AL</CountryCode>
    <InitiativeCount>7</InitiativeCount>
    <SearchURL>~/advance_search.aspx?search=6</SearchURL>
  </Country>
  <Country>
    <Name>Argentina</Name>
    <CountryCode>AR</CountryCode>
    <InitiativeCount>15</InitiativeCount>
    <SearchURL>~/advance_search.aspx?search=11</SearchURL>
  </Country>
  ... and so on ...
</icapCountryData>

Answer 1:

解决它! 本来,我是调用函数parseDensityMapXML()然后后立即调用另一个函数loadDensityMapXML()历时第一函数动态创建的对象,并通过它迭代。 问题是,它不叫从第一功能的回调 ,所以被解雇的对象甚至已经建成了。

要解决,我只是修改上述调用第二功能。每个() 之后,结束了创建对象的第一个函数:

function parseDensityMapXML() {
$.ajax({
    type: "GET",
    url: "media/XML/mapCountryData.xml",
    dataType: "xml",
    success: function (xml) {
        $(xml).find("Country").each(function () {
            var cName = $(this).find("Name").text();
            var cIniCount = $(this).find("InitiativeCount").text();
            var cUrl = $(this).find("SearchURL").text();
            var cCode = $(this).find("CountryCode").text();

            //Populate the JS Object
            iniDensityData[cCode] = { "initiatives": cIniCount, "url": cUrl, "name": cName };
            //set colors according to values of initiatives count
            colorArray[cCode] = getCountryColor(cIniCount);
        });

        /* and then call the jVectorMap plugin - this MUST be done as a callback
           after the above parsing.  If called separately, it will fire before the
           objects iniDensityData and colorArray are created! */
        loadDensityMapXML();
    }
});
} //end function parseDensityMapXML();


文章来源: Javascript - Trouble using for…in to iterate through an object