在 for 循环中,为什么 i++ 在第二次使用后变为 1
In for loop, why does i++ change to 1 after second use?
为什么我的 var i in for 循环从 0 变为 1?
这一行:for for (var i = 0; i
结果是通过方法调用(推送)到未定义的元素而出错。
var newsUpdates = {};
var siteDatabase = [
"http://example.to"
];
var scraperjs = require('scraperjs');
for (var i = 0; i < siteDatabase.length; i++) {
news[siteDatabase[i]] = [];
scraperjs.StaticScraper.create(siteDatabase[i])
.scrape(function($) {
return $(".lang_English").map(function() {
return $(this).children('td').eq(1).children(
'a').last().text();
}).get();
}, function(news) {
for (var x = 0; x < news.length; x++) {
if (news[x] == '') {
news.splice(x, 1);
}
}
for (var x = 0; x < news.length; x++) {
// i in siteDatabase[i] is not 0, but 1??
newsUpdates[siteDatabase[i]].push({
"title": news[x]
});
// TypeError: Cannot call method 'push' of undefined
}
console.log(newsUpdates);
})
}
问题出在我在代码之间评论的区域。
您传递给.scrape
的函数具有对i
变量的持久引用,而不是创建函数时的副本。因此,它使用函数运行时的i
值,这(大概)是在循环结束后,当i
的值发生变化时。
在这种情况下,我可能会使用构建器函数来构建回调,以便回调关闭不会更改的内容:
var newsUpdates = {};
var siteDatabase = [
"http://example.to"
];
var scraperjs = require('scraperjs');
for (var i = 0; i < siteDatabase.length; i++) {
news[siteDatabase[i]] = [];
scraperjs.StaticScraper.create(siteDatabase[i])
.scrape(function($) {
return $(".lang_English").map(function() {
return $(this).children('td').eq(1).children(
'a').last().text();
}).get();
}, buildCallback(i))
}
function buildCallback(index) {
return function(news) {
for (var x = 0; x < news.length; x++) {
if (news[x] == '') {
news.splice(x, 1);
}
}
for (var x = 0; x < news.length; x++) {
newsUpdates[siteDatabase[inindex]].push({
"title": news[x]
});
}
console.log(newsUpdates);
};
}
在那里,我们从buildCallback
返回的函数在index
参数上关闭,其值永远不会改变。然后我们i
传递到它,以便构建我们的回调。
由于siteDatabase
似乎是一个数组,解决此问题的另一种方法是使用 siteDatabase.forEach
,这将为每次迭代提供一个单独的闭包变量。我更喜欢这种方法而不是构建器函数方法,因为它更直接且易于遵循:
var newsUpdates = {};
var siteDatabase = [
"http://example.to"
];
var scraperjs = require('scraperjs');
siteDatabase.forEach(function (site) {
scraperjs.StaticScraper.create(site)
.scrape(function($) {
return $(".lang_English").map(function() {
return $(this).children('td').eq(1)
.children('a').last().text();
}).get();
}, function(news) {
newsUpdates[site] = news.filter(function (item) {
return item != '';
}).map(function (item) {
return { title: item };
});
console.log(newsUpdates);
});
});
您可以进一步将其分解为函数,以使其更清晰,更具表现力:
var newsUpdates = {};
var siteDatabase = [
"http://example.to"
];
var scraperjs = require('scraperjs');
function scrapePageNewsItems($) {
return $(".lang_English").map(function() {
return $(this).children('td').eq(1)
.children('a').last().text();
}).get();
}
function notBlank(item) {
return item != '';
}
function convertNewsItem(item) {
return { title: item };
}
function convertNewsItems(news) {
return news.filter(notBlank).map(convertNewsItem);
}
siteDatabase.forEach(function (site) {
scraperjs.StaticScraper.create(site)
.scrape(scrapePageNewsItems, function(news) {
newsUpdates[site] = convertNewsItems(news);
console.log(newsUpdates);
});
});
相关文章:
- jQuery:循环一个具有不同超时值的循环
- 在循环中分配json值时,值被覆盖
- 如何在下面的ES6循环中获得前面的文本
- 为什么“;未定义的“;在JavaScript中结束循环
- Javascript循环不会自我更新
- 如何使用jquery处理php循环通过元素
- 而循环只设置php中输入字段中的第一个值
- 循环遍历数组中的特定索引
- Javascript返回值只在循环中返回一次
- 按照选项卡索引的顺序循环一个jQuery选择
- 循环遍历以数组为值的Javascript对象
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 循环结束/推送到数组之前在页面上呈现EJS
- 循环比赛位置算法
- jQuery循环在特定位置暂停
- 我的javascript for循环不起作用
- 循环浏览多个身体背景图像
- W3C循环样式的JavaScript
- For循环冻结Javascript