如何在Javascript的单个地图函数中执行两项操作

时间:2019-01-22 05:50:20

标签: javascript arrays puppeteer

我目前正在尝试从Github的趋势页面中获取所有趋势信息库以及它们拥有的星星,并从中创建一个文本文件。网址为this

我同样使用Puppeteer。

对于存储库列表,我这样做了

const data = await page.evaluate(()=>{
        const tds =Array.from(document.querySelectorAll('.explore-content ol li div h3'));
        return tds.map(td => td.textContent);
    });

这给了我这样的结果

The top repositories are 

    charlax / professional-programming
,

    ssloy / tinyraytracer
,

    komeiji-satori / Dress
,

    ForrestKnight / open-source-cs
,

    hjacobs / kubernetes-failure-stories
,

    osforscience / deep-learning-ocean
,

    alexkimxyz / nsfw_data_scrapper
,

    kamranahmedse / developer-roadmap
,

    typescript-eslint / typescript-eslint
,

    Musish / Musish
,

    MisterBooo / LeetCodeAnimation
,

    yagiz / Bagel
,

    SpaceVim / SpaceVim
,

    antonmedv / fx
,

    pjialin / py12306
,

    braver / programmingfonts
,

    macrozheng / mall
,

    Snailclimb / JavaGuide
,

    schollz / howmanypeoplearearound
,

    flutterchina / flutter-in-action
,

    flutter / flutter
,

    rikschennink / shiny
,

    doocs / advanced-java
,

    MFatihMAR / Awesome-Game-Networking
,

    go-task / task

要获得星星,我还有另一个类似的功能

const stars = await page.evaluate(()=>{
        const stars = Array.from(document.querySelectorAll('.explore-content ol li div:nth-child(4) a'));
        return stars.map(star=>star.textContent);

    });

以这种方式输出

主要仓库

    5,304
  ,

    379
  ,
          ,,,,,,

    1,173
  ,

    44

我想将两种方法的输出合并为一个方法,以便获得结果

  
    

charlax / professional-programming有5304星。

  

如何合并datastars方法的输出,或者如何在一个方法中进行两种不同的操作。我可以在单个map方法内执行两个模拟操作吗?如果可以,怎么办?

3 个答案:

答案 0 :(得分:1)

也许是更安全的方法:

display:block

答案 1 :(得分:0)

您要“压缩”两个数组的结果,然后在其上进行映射

await page.evaluate(()=>{
  const repos = Array.from(document.querySelectorAll('.explore-content ol li div h3'));
  const stars = Array.from(document.querySelectorAll('.explore-content ol li div:nth-child(4) a'));

  // this is an array of tuples (two element arrays)
  // where the first element is the name and the second is the star count
  const zipped = repos.map((repoName, idx) => [repoName, stars[idx])

  return zipped.map(([repoName, starCount]) => `${repoName.textContent} ${starCount.textContent}`)
});

答案 2 :(得分:0)

您可以执行以下操作。对于同一件事,您不必等待两次。

const data = await page.evaluate(()=>{
  const stars = Array.from(document.querySelectorAll('.explore-content ol li div:nth-child(4) a'));
  const tds =Array.from(document.querySelectorAll('.explore-content ol li div h3'));
  var resArr = []
  for(let i = 0; i<stars.length; i++){
    resArr.push(`${tds[i].textContent} has ${stars[i].textContent}`)
  }
  return resArr;
}