Ссылаясь на «это» без использования «это» - PullRequest
0 голосов
/ 02 октября 2018

Есть ли способ переписать этот вложенный цикл Cheerio без использования this?

  $("tr").each(function(i) {
    $(this)
      .find(".windowbg>[id^=msg]")
      .each(function(i) {
        const link = $(this).find("a");

        const subject: string = link.text();
        const id = extractId(link.prop("href"));

        threads.push(new Thread(id, subject));
      });
  });

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

jQuery

Вам не нужно использовать this, если вы используете названный параметр.В jQuery вторым аргументом .each() является элемент в контексте (эквивалентный this ), поэтому вы бы $('tr').each(function(index, element){ ... })

$("tr").each(function(i, tr) {
  $(tr)
    .find(".windowbg>[id^=msg]")
    .each(function(i, msg) {
      const link = $(msg).find("a");
      const subject: string = link.text();
      const id = extractId(link.prop("href"));

      threads.push(new Thread(id, subject));
    });
});

ES6 +

Вы можете вообще отказаться от jQuery, используя ES6 и более поздние версии.Функции стрелок (и forEach) помогают сократить синтаксис:

let rows = document.querySelectorAll('tr')
rows.forEach(row => {

  let messages = row.querySelectorAll('.windowbg > [id^=msg]')
  messages.forEach(message => {
    const link    = message.querySelector('a')
    const subject = link.textContent
    const id      = link.href // extractId(link.href)

    console.log(`id: ${id}`)
    // threads.push(new Thread(id,subject)
  })
})
table,
td {
  border: 1px solid #999;
  border-collapse: collapse
}

td {
  padding: .75rem
}

table {
  width: 75%;
  margin: 0 auto;
}
<table>
  <tbody>
    <tr>
      <td class="windowbg">
        <span id="msg1"><a href="#link1">Link</a></span>
        <span id="notmsg1"><a href="#foo2">Foo</a></span>
        <div>Other Text</div>
      </td>
      <td>Other Cell</td>
    </tr>
    <tr>
      <td class="windowbg">
        <span id="msg2"><a href="#link2">Link</a></span>
        <span id="notmsg2"><a href="#foo2">Foo</a></span>
        <div>Other Text 2</div>
      </td>
      <td>Other Cell</td>
    </tr>
  </tbody>
</table>
0 голосов
/ 03 октября 2018

Вы можете сделать это с помощью функции стрелки (ES6 +)

$("tr").each((i, tr) => {
  $(tr).find(...) // access the element
  this.xxx // "this" is original scope
})
...