arrays - Array .push 在每个循环内返回用相同对象填充的数组
问题描述
我正在尝试使用cheeriosJS 抓取网页以获取一些信息。问题是我需要一个 each 循环来覆盖一个变量并将该变量推送到一个空数组。虽然我正在正确地进行网络抓取(每个循环我得到一个不同的对象),但当我在循环完成后打印数组时,我得到一个重复多次相同对象的数组。我在这里想念什么?
const rp = require('request-promise');
const $ = require('cheerio');
let marketSpain = {
country: 'Spain',
name: 'IBEX 35',
companies: []
}
let companySpain = {
name: null,
last: null,
high: null,
low: null,
change: null,
changePerCent: null,
volume: null,
time: null,
purchase: false,
sale: false
}
rp({
uri: 'url',
headers: {
'User-Agent': 'Request-Promise'
}
}).then(html => {
$("table[class='genTbl closedTbl crossRatesTbl elpTbl elp30'] > tbody > tr", html).each((i, elem) => {
companySpain.name = $("td[class='bold left noWrap elp plusIconTd'] > a", html).eq(i).html();
companySpain.last = $("td", elem).eq(2).text();
companySpain.high = $("td", elem).eq(3).text();
companySpain.low = $("td", elem).eq(4).text();
companySpain.change = $("td", elem).eq(5).text();
companySpain.changePerCent = $("td", elem).eq(6).text();
companySpain.volume = $("td", elem).eq(7).text();
companySpain.time = $("td", elem).eq(8).text();
marketSpain.companies.push(companySpain);
});
console.log(marketSpain)
markets.push(marketSpain);
}).catch(err => {
console.log(err);
})
解决方案
您正在修改同一个对象并将其附加到列表的末尾。你想要做的是:
const rp = require('request-promise');
const $ = require('cheerio');
let marketSpain = {
country: 'Spain',
name: 'IBEX 35',
companies: []
}
rp({
uri: 'url',
headers: {
'User-Agent': 'Request-Promise'
}
}).then(html => {
$("table[class='genTbl closedTbl crossRatesTbl elpTbl elp30'] > tbody > tr", html).each((i, elem) => {
marketSpain.companies.push({
name: $("td[class='bold left noWrap elp plusIconTd'] > a", html).eq(i).html(),
last: $("td", elem).eq(2).text(),
high: $("td", elem).eq(3).text(),
low: $("td", elem).eq(4).text(),
change: $("td", elem).eq(5).text(),
changePerCent: $("td", elem).eq(6).text(),
volume: $("td", elem).eq(7).text(),
time: $("td", elem).eq(8).text(),
purchase: false,
sale: false
});
});
console.log(marketSpain)
markets.push(marketSpain);
}).catch(err => {
console.log(err);
})
推荐阅读
- r - 使用带有 if else 条件的 map 从嵌套数据框中提取特定行
- pandas - 如何在 Matplotlib Graph 中调整图例标签的大小
- node.js - 如何使用猫鼬将一组不同类型的对象保存到数据库中?
- c# - ASP.NET MVC 动态模型未被识别
- google-apps-script - 使用应用脚本将 Bigquery 数据推送到 Google 工作表
- excel - 如何使用vba清除工作表中的数据
- python - 评估气流中的模板后如何返回对象?
- java - 如何使用单元测试测试 void?
- vue.js - 手动运行 vue-apollo 查询时禁用缓存
- android - 使用 jFrog 工件发布了一个库,使用库时未加载外部依赖项