Объединить параметр обратного вызова forEach с параметром функции - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь объединить параметр обратного вызова 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 голосов
/ 25 января 2019

Используйте значение свойства, которое вы передаете в качестве вычисленного ключа вашего объекта el (tag в вашем коде), чтобы динамически передавать значение свойства для элемента внутри forEach, в зависимости от свойства, которое вы передали в

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