组合forEach回调参数和函数参数

时间:2019-01-24 23:33:36

标签: javascript node.js foreach jsdom

我正在尝试将forEach回调参数(HTMLAnchorElement / HTMLTableCellElement对象)与功能参数(string)组合在一起。

我正在做的是在一个函数调用中获得href标记的a,然后在另一个函数调用中获得textContent标记的td,使用相同的功能。

这是我的代码:

// example usage of function
await scraper.scraper(args, 'a[href]', 'href') // get href

await scraper.scraper(args, 'table tr td', 'textContent') // get textContent

// scraper function
const scraper = async (urls, regex, property) => {
  const promises = []
  const links = []

  urls.forEach(async url => {
    promises.push(fetchUrls(url))
  })

  const promise = await Promise.all(promises)
  promise.forEach(html => {
    const arr = Array.from(new JSDOM(html).window.document.querySelectorAll(regex))
    arr.forEach(tag => {
      links.push(tag.href) // how about textContent?
    })
  })

  return links
}

有没有办法将tag中的回调参数forEach与功能参数property组合在一起?

以下代码有效。但是,如果我想对其他属性进行进一步的函数调用怎么办?我不想每次调用另一个函数时都添加一个if语句,这破坏了函数的可重用性。
property === 'textContent' ? links.push(tag.textContent) : links.push(tag.href)

任何试图将两者结合的尝试似乎都错了。不可能吗?

1 个答案:

答案 0 :(得分:2)

使用传入的属性值作为el对象(代码中的tag)的计算键,以便根据不同的对象动态地传递forEach内元素的属性值。您传入的财产

arr.forEach(el => {
  links.push(el[property]);
})