Javascript使用对象和变量中的列表项

时间:2013-10-16 20:24:17

标签: javascript arrays list loops

* 使用Genia S的代码。我已将“解决方法”附加到帖子底部 *

我的头脑正在从3个小时的浏览论坛和尝试代码片段开始。我的主要问题是我不是程序员,我一起修改代码直到我开始工作。任何解释或方向将不胜感激。变量,对象,数组在某些方面似乎都是相同的,我不明白复杂性。

我想带走这段代码的重复性(使用leafletjs作为构造函数)。复制/粘贴相同的代码20-30次似乎不优雅:

var manholes = new L.TileLayer.WMS("http://wms.server.address", {
  layers: 'manholes',
  format: 'image/png8',
  transparent: true
});

var stormdrains = new L.TileLayer.WMS("http://wms.server.address", {
  layers: 'stormdrains',
  format: 'image/png8',
  transparent: true
});

continued for each layer I need to create

当我只在两个地方改变一个单词( manholes,stormdrains等 ....)时,这似乎是很多冗余的代码。所以,我试图将这个过程简化为:

  var layerlist = ["manholes","stormdrains","gravitylines","pumpstations"];

  for (i = 0; i < layerlist.length; i++) {

    var layerlist[i] = new L.TileLayer.WMS("http://wms.server.address", {
      layers: layerlist[i],
      format: 'image/png8',
      transparent: true
    });

  };

请不要假设我知道为什么我使用 _ __ _ _ 而不是 _ __ _ ;或者为什么我我应该做 _ ___ _ __ _ < / EM> __ _ _ 即可。我开始这篇文章时承认我缺乏理解。


以下是我正在使用的代码。我没有像Genia建议的那样推送新阵列,而是使用window []来创建新对象(我不知道它是如何工作的)。我使用Genia的解决方案的问题是,在代码中,leafletjs抛出异常试图访问新数组中的对象。符号。如果可以解决这个问题,我很高兴学习。谢谢大家的帮助,感谢Genia的评论和回复。所有不良做法和屠宰代码都是我自己做的,没有任何负面因素应归于Genia。

var layerlist = ["manholes","stormdrains","gravitylines","pumpstations"];

for (var i = 0; i < layerlist.length; i++) {
  var name = String(layerlist[i])
  window[name] = new L.TileLayer.WMS(ramnode, {
    layers: name,
    format: 'image/png8',
    transparent: true
  });
};

现在我有四个新的,单独的对象,名为人孔,风暴,重力线,泵站,其行为完全相同,就像我以原始方式创建它们一样(顶部的第一个代码示例)

2 个答案:

答案 0 :(得分:2)

for (x = 0; i < layerlist.length; i++) {

var layerlist[i] = new L.TileLayer.WMS("http://wms.server.address", {
  layers: layerlist[i],
  format: 'image/png8',
  transparent: true
});

};

注意你是如何声明x然后在循环中使用i的? (这是一个循环,顺便说一下。)

大概是如果你将x= 0转换为var i = 0(这里声明var更安全,以防万一你的代码中的某个地方全局范围内有另一个i意外踩)你应该得到你需要的东西(假设你的其余代码指向一个名为L的东西,这里没有显示)。

哦,var layerList[i]也错了。

首先你想要像这样在循环中声明一个layerList数组:

var layerList = new Array();

然后你可以通过

添加它
layerList[i]; // notice NO var here

所以结果将是

 var layerList = new Array();
    for (var i = 0; i < layerlist.length; i++) {

    layerList[i] = new L.TileLayer.WMS("http://wms.server.address", {
  layers: layerlist[i],
  format: 'image/png8',
  transparent: true
});
};

答案 1 :(得分:0)

我注意到的主要内容是你的构造函数( _ _),你从x = 0开始,然后切换到使用i作为你的迭代器变量。尝试在构造函数中使用i切换x,看看是否能满足您的需求;除此之外,它似乎非常有用。