Javascript 如何嵌套循环以在关联数组(JS)内的索引数组中循环
我有一个URL索引数组嵌套在另一个数组中,该数组使用字符串作为键。我需要从两个数组中提取信息,并使用以下循环Javascript 如何嵌套循环以在关联数组(JS)内的索引数组中循环,javascript,Javascript,我有一个URL索引数组嵌套在另一个数组中,该数组使用字符串作为键。我需要从两个数组中提取信息,并使用以下循环 // Loop through the elements in the associative level to get a count of its items var keyCnt = 0; for(key in serviceCategories) { keyCnt++; } // Then loop through i
// Loop through the elements in the associative level to get a count of its items
var keyCnt = 0;
for(key in serviceCategories) {
keyCnt++;
}
// Then loop through it again, this time nesting another for loop to get at the inner/indexed arrays
for(key in serviceCategories) {
var currCat = key;
for (var i = 0; i < keyCnt; i++) {
$.ajax({
url: serviceCategories[currCat][i],
success: function(data) {
parsePageCont (data, currCat);
}
});
}
}
}
//循环关联级别中的元素以获取其项的计数
var-keyCnt=0;
用于(输入serviceCategories){
keyCnt++;
}
//然后再次遍历它,这次嵌套另一个for循环以获取内部/索引数组
用于(输入serviceCategories){
var currCat=键;
对于(变量i=0;i
此代码对于第一个数组的第一个元素正常工作。它循环遍历其内部数组,并对每个url执行ajax调用,没有问题。但是,当它处理完第一个数组的第一个元素后,它不会继续处理第二个元素并获取它的内部数组数据
我希望这个解释没有太混乱
为了更加清晰,您可以在这里看到完整的代码:假设您的数据结构是一个带有属性数组的对象,您可以这样做
serviceCategories
必须是对象,而不是数组。Javascript没有关联数组。它具有按键存储和按键迭代的对象。数组索引是数字的键
变量,因为该变量在循环后很长时间内被调用,因此其值已更改。为了解决这个问题,我们将键放在一个上下文对象中,该对象将被设置为成功处理程序的“this”指针,这样我们就可以返回到键李>
以下是解决这些问题的代码:
// assume data is of this structure (where I've shown numbers here, they are actually URLs)
serviceCategories = {
houses: [1,2,3,4],
cottages: [5,6,7,8],
hotels: [8,9,0,1],
apartments: [2,2,3,4,5,7,8,9]
};
for (key in serviceCategories) {
if (serviceCategories.hasOwnProperty(key)) {
var array = serviceCategories[key];
// got the next array, iterate through it
for (var i = 0; i < array.length; i++) {
var context = {};
$.ajax({
url: array[i],
context: {key: key}, // can't refer to key in success handler, so we sest it as context
success: function(data) {
parsePageCont(data, this.key);
}
}
});
}
}
//假设数据是这种结构(我在这里显示的数字实际上是URL)
服务类别={
房屋:[1,2,3,4],
村舍:[5,6,7,8],
酒店:[8,9,0,1],
公寓:[2,2,3,4,5,7,8,9]
};
用于(输入serviceCategories){
if(serviceCategories.hasOwnProperty(键)){
var数组=serviceCategories[键];
//得到下一个数组,遍历它
对于(var i=0;i
假设您的数据结构是一个带有属性数组的对象,您可以这样做
serviceCategories
必须是对象,而不是数组。Javascript没有关联数组。它具有按键存储和按键迭代的对象。数组索引是数字的键
变量,因为该变量在循环后很长时间内被调用,因此其值已更改。为了解决这个问题,我们将键放在一个上下文对象中,该对象将被设置为成功处理程序的“this”指针,这样我们就可以返回到键李>
以下是解决这些问题的代码:
// assume data is of this structure (where I've shown numbers here, they are actually URLs)
serviceCategories = {
houses: [1,2,3,4],
cottages: [5,6,7,8],
hotels: [8,9,0,1],
apartments: [2,2,3,4,5,7,8,9]
};
for (key in serviceCategories) {
if (serviceCategories.hasOwnProperty(key)) {
var array = serviceCategories[key];
// got the next array, iterate through it
for (var i = 0; i < array.length; i++) {
var context = {};
$.ajax({
url: array[i],
context: {key: key}, // can't refer to key in success handler, so we sest it as context
success: function(data) {
parsePageCont(data, this.key);
}
}
});
}
}
//假设数据是这种结构(我在这里显示的数字实际上是URL)
服务类别={
房屋:[1,2,3,4],
村舍:[5,6,7,8],
酒店:[8,9,0,1],
公寓:[2,2,3,4,5,7,8,9]
};
用于(输入serviceCategories){
if(serviceCategories.hasOwnProperty(键)){
var数组=serviceCategories[键];
//得到下一个数组,遍历它
对于(var i=0;i
嗯,一个问题似乎是假设数组的第二维度总是相同的大小(即keyCnt)。你似乎也在计算错误的方向,我的意思是你会得到两个(inGoodHands和spaRituals),而你用它来计算第二个索引,inGoodHands是2,spaRituals是3)
看起来你应该这样做:
for(x in serviceCategories) {
for(y in serviceCategories[x]) {
call ajax for serviceCategories[x][y]
}
}
一个问题似乎是假设数组的第二维度总是相同的大小(即keyCnt)。你似乎也在计算错误的方向,我的意思是你会得到两个(inGoodHands和spaRituals),而你用它来计算第二个索引,inGoodHands是2,spaRituals是3) 看起来你应该这样做:
for(x in serviceCategories) {
for(y in serviceCategories[x]) {
call ajax for serviceCategories[x][y]
}
}
Javascript作用域是函数,而不是块。虽然您可以将
var curcat
放入for循环中,但重要的是要了解您没有为每个迭代创建不同的变量
这意味着您在循环中创建的所有闭包实际上都基于同一个变量,因此您可能观察到的不是第一个闭包有效,而是所有闭包都在最后一个关键点有效
在javascript中创建局部作用域的解决方案是使用局部函数;而不是
(function(data){ parsePageCount(data, curcat); })
你可以用
(function(x){return function(data){ parsePageCount(data, x); };})(curcat)
其中已使用名称x
而不是curcat
来明确区别
对于每个创建的闭包,该变量实际上是独立的。<