我在Google Maps API项目中循环使用多个数组时遇到问题。
我在markers数组中有一个类别数组,我希望能够根据用户在下拉/选择菜单中选择的内容对它们进行排序。
当他们选择一个值时,运行以下函数:
filterMarkers = function (category) {
for (i = 0; i < markers1.length; i++) {
marker = gmarkers1[i];
console.log(marker.category);
for(i = 0; i < marker.category.length; i++) {
// If is same category or category not picked
if (marker.category[i] == category || category.length === 0) {
marker.setVisible(true);
}
// Categories don't match
else {
marker.setVisible(false);
}
}
}
}
但不是将数组中的每个项目与选中的项目进行比较,而是保持循环。
JS小提琴: http://jsfiddle.net/japaneselanguagefriend/t3xaj1j5/1/
答案 0 :(得分:3)
您在两个不同的循环中使用相同的全局计数器(i
)。
JS对var
声明使用函数级作用域,但允许您使用变量而不会因遗留原因而声明它。你的两个循环都使用i
而没有声明它,所以你正在处理一个全局变量。
在ES5中,您可以通过在两个循环中声明计数器并更改一个以使用另一个变量来解决此问题,例如:
for (var i = 0; i < foo; ++i) {
for (var j = 0; j < bar; ++j) {
...
}
}
最新的语言版本添加了块范围的变量,但由于您的循环是嵌套的,因此您仍需要不同的名称:
for (let i = 0; i < foo; ++i) {
for (let j = 0; j < bar; ++j) {
...
}
}
无论哪种方式,请确保声明变量(使用var
或let
,具体取决于可用的语言级别),以便它们不会泄漏到全局范围内。你的脚本应该有一个"use strict";
,这将阻止全局/未声明的变量。