在箭头函数执行期间过滤数组

Filter an array during an arrow function execution

我正在使用 Node 的 Puppeteer 库来抓取 website's table。

抓取期间,它returns两个数组,一个包含所述table的所有行和列,第二个数组只包含第一列table。我不知道为什么会这样,也无法解决这个问题。

这是我用来抓取 table:

的代码
var result = await page.$$eval('tbody > tr', rows => {
    return Array.from(rows, row => {
        const columns = row.querySelectorAll('td');
        const arr = Array.from(columns, column => column.innerText);
        if (arr.length <= 1) {
            return;
        }
        return arr;
    });
});

如您所见,我正在尝试从结果数组中过滤出第二个 table,但是,我假设由于箭头函数已经在做这件事,只需调用 return 将导致数组内出现空值。我不希望这样,因为这个问题导致数组的值数量增加了一倍。

我可以使用以下代码过滤掉空值:

var filtered = result.filter(function (el) {
    return el != null;
});

但在这样做时我第二次迭代数组只是为了过滤掉空值,这是执行我的例程所花费时间的两倍。

我的问题是:如何过滤掉这些列数等于或小于1的行?

编辑:尽管我接受了 James 的回答,但我应该提到 Barmar 在评论部分指出了我的问题的真正解决方法,我应该使用 table#filter--result-table-resumo > tbody > tr 评估页面,因此过滤掉第二个不需要的 table.

这是最终代码:

var result = await page.$$eval('table#filter--result-table-resumo > tbody > tr', rows => {
    return Array.from(rows, row => {
        const columns = row.querySelectorAll('td');
        return Array.from(columns, column => column.innerText);
    });
});

Array.from 旨在 return 一些精确长度的数组,它并不意味着过滤掉行,因为你需要 array.filter.

Array.from(rows).filter(row => row.querySelectorAll('td').length > 1);

正如@Barmar 指出的那样,我错过了您的映射。与其使用 .filter 和 .map(你已经指出效率很重要),不如使用 .reduce 将它们结合起来,一步完成两个操作:

Array.from(rows).reduce((acc, row) => {
    const columns = row.querySelectorAll('td');
    if (columns.length > 1) {
      acc.push(Array.from(columns, column => column.innerText));
    }
    return acc;
  }, []);