首页 > 解决方案 > 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);
})

标签: arraysnode.jsweb-scraping

解决方案


您正在修改同一个对象并将其附加到列表的末尾。你想要做的是:

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);
})

推荐阅读