Javascript 在对象的内部和数组中插入新的键值对,但值是由axios.get创建的

Javascript 在对象的内部和数组中插入新的键值对,但值是由axios.get创建的,javascript,node.js,axios,Javascript,Node.js,Axios,所以我一直在做刮刀。一切都很好,直到我尝试为单个链接抓取数据 现在我来解释一下:我有一个刮板,它可以帮我刮取关于公寓的数据。现在,第一个url是文章所在的页面(大约应该取29-30个)。现在在那个页面上我没有关于平方米的信息,所以我需要为每个被刮的链接运行另一个刮板,然后从那里刮平方米 以下是我的代码: const axios = require('axios'); const cheerio = require('cheerio'); const url = `https://www.olx

所以我一直在做刮刀。一切都很好,直到我尝试为单个链接抓取数据

现在我来解释一下:我有一个刮板,它可以帮我刮取关于公寓的数据。现在,第一个url是文章所在的页面(大约应该取29-30个)。现在在那个页面上我没有关于平方米的信息,所以我需要为每个被刮的链接运行另一个刮板,然后从那里刮平方米

以下是我的代码:

const axios = require('axios');
const cheerio = require('cheerio');

const url = `https://www.olx.ba/pretraga?vrsta=samoprodaja&kategorija=23&sort_order=desc&kanton=9&sacijenom=sacijenom&stranica=2`;
axios.get(url).then((response) => {
  const articles = [];
  const $ = cheerio.load(response.data);

  $('div[id="rezultatipretrage"] > div')
    .not('div[class="listitem artikal obicniArtikal  i index"]')
    .not('div[class="obicniArtikal"]')
    .each((index, element) => {
      $('span[class="prekrizenacijena"]').remove();
      const getLink = $(element).find('div[class="naslov"] > a').attr('href');
      const getDescription = $(element)
        .find('div[class="naslov"] > a > p')
        .text();
      const getPrice = $(element)
        .find('div[class="datum"] > span')
        .text()
        .replace(/\.| ?KM$/g, '')
        .replace(' ', '');
      const getPicture = $(element)
        .find('div[class="slika"] > img')
        .attr('src');

      articles[index] = {
        id: getLink.substring(27, 35),
        link: getLink,
        description: getDescription,
        price: getPrice,
        picture: getPicture,
      };
    });

  articles.map((item, index) => {
    axios.get(item.link).then((response) => {
      const $ = cheerio.load(response.data);
      const sqa = $('div[class="df2  "]').first().text();
    });
  });

  console.log(articles);
});

现在,代码的第一部分就像它应该的一样,我一直在努力解决第二部分

现在我正在映射
文章
,因为在那里,对于每个链接,我需要将其加载到
axios
函数中,并获取关于平方米的数据

所以我想要的输出是更新的文章:里面有旧的对象和键值,但有键值sqm和刮取的sqaure值

关于如何实现这一点有什么想法吗?
谢谢

您只需将有关平方米的信息添加到当前的
文章
/
项目
,类似于:

const articlePromises = Promise.all(articles.map((item) => {
            return axios.get(item.link).then((response) => {
                const $ = cheerio.load(response.data);
                const sqa = $('div[class="df2  "]').first().text();
                item.sqm = sqa;
            });
        }));

articlePromises.then(() => {
    console.log(articles);    
});
请注意,在记录生成的文章之前,您需要等待所有映射的承诺得到解决。 还请注意,使用
async/await
可以将代码重写得更干净一些,请参阅