首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何合并传递到函数中的数组?

如何合并传递到函数中的数组?
EN

Stack Overflow用户
提问于 2021-02-17 08:31:48
回答 1查看 57关注 0票数 0

所以我一直在研究我的项目,其中涉及刮刀。

接下来是工作流:现在有两个刮板。数据将被解析并推送到每个单独刮板的数组中,并传递给合并组件。

因此合并组件如下所示:

代码语言:javascript
复制
let mergedApartments = []; //Creating merged list of apartments
exports.mergeData = (apartments) => {
  //Fetching all apartments that are passed from scraper(s)
  mergedApartments.push(...apartments); //Pushing apartments into the list
  console.log(mergedApartments.length);
};

所以现在mergedApartments.length的输出是9 39。第一个函数调用mergeData()并将其传递给数组,其中包含9个对象,而另一个刮板在数组中包含30个对象,后者再次传递给mergeData

这不是我所期望的。我期望有一个数组,其中包含来自刮板的所有合并对象。现在,scraperno1发送公寓并将其添加到mergedApartments中,然后scraperno2发送公寓,并通过向数组中添加新的adding对象来覆盖该数组。

现在,我需要不同的输出:我只想从数组中得到一个包含所有合并对象的列表。因为这些数据将传递给存储组件,而且我不想多次查询DB,因为对于每个新的mergedApartments列表,数据将被插入并创建重复的值--抛出一个错误。

所以,我尝试过:我尝试创建一个计数器,它计算函数mergeData调用的时间,然后执行合并的逻辑,但是没有成功。

所以我只想让我的数组有一个mergedApartments.length的输出-在这个例子中是39。

谢谢!

编辑这里的刮刀是什么样子:

代码语言:javascript
复制
const merge = require('../data-functions/mergeData');
const axios = require('axios');
const cheerio = require('cheerio');

//function for olx.ba scraper. Fetching raw html data and pushing it into array of objects. Passing data to merge function

exports.santScraper = (count) => {
  const url = `https://www.sant.ba/pretraga/prodaja-1/tip-2/cijena_min-20000/stranica-${count}`;

  const santScrapedData = [];
  const getRawData = async () => {
    try {
      await axios.get(url).then((response) => {
        const $ = cheerio.load(response.data);

        $('div[class="col-xxs-12 col-xss-6 col-xs-6 col-sm-6 col-lg-4"]').each(
          (index, element) => {
            const getLink = $(element).find('a[class="re-image"]').attr('href');
            const getDescription = $(element).find('a[class="title"]').text();
            const getPrice = $(element)
              .find('div[class="prices"] > h3[class="price"]')
              .text()
              .replace(/\.| ?KM$/g, '')
              .replace(',', '.');
            const getPicture = $(element).find('img').attr('data-original');
            const getSquaremeters = $(element)
              .find('span[class="infoCount"]')
              .first()
              .text()
              .replace(',', '.')
              .split('m')[0];
            const pricepersquaremeter =
              parseFloat(getPrice) / parseFloat(getSquaremeters);

            santScrapedData[index] = {
              id: getLink.substring(42, 46),
              link: getLink,
              descr: getDescription,
              price: Math.round(getPrice),
              pictures: getPicture,
              sqm: Math.round(getSquaremeters),
              ppm2: Math.round(pricepersquaremeter),
            };
          }
        );
        merge.mergeData(santScrapedData); //here i'm calling function and passing array to function
      });
    } catch (error) {
      console.log(error);
    }
  };
  getRawData();
};

其他刮板看起来一样(这是相同的函数调用)

EN

回答 1

Stack Overflow用户

发布于 2021-02-17 08:33:58

为此,您需要使用来自数组原型的concat函数

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat

代码语言:javascript
复制
exports.mergeData = (apartments) => {
  mergedApartment = mergedApartments.concat(apartments);
};

exports.sendData = () => {
  console.log(mergedApartment.length);
}

在你的主要剧本里

代码语言:javascript
复制
getRawData().then(merge.sendData);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66238293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档