在箭头函数执行期间过滤数组
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;
}, []);
我正在使用 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;
}, []);