Как отфильтровать таблицу html для точного соответствия слов и слов с помощью простого javascript? - PullRequest
1 голос
/ 30 марта 2020

Я нашел решение отфильтровать таблицу на Как отфильтровать таблицу html с помощью простого javascript?
Но мой сценарий использования - отфильтровать его для сопоставления слов и слов. Например, если таблица содержит Джона и Джонатона, если я ищу Джона, он ничего не должен возвращать, а если я ищу Джона, он должен возвращать только Джона.

function myFunction() {
  var input, filter, table, tr, td, i;
  input = document.getElementById("myInput");
  filter = input.value.toUpperCase();
  table = document.getElementById("myTable");
  tr = table.getElementsByTagName("tr");
  for (i = 0; i < tr.length; i++) {
    td = tr[i].getElementsByTagName("td")[0];
    if (td) {
      if (td.innerHTML.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      } else {
        tr[i].style.display = "none";
      }
    }
  }
}
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names.." title="Type in a name">

<table id="myTable">
  <tr class="header">
    <th style="width:60%;">Name</th>
    <th style="width:40%;">Country</th>
  </tr>
  <tr>
    <td>John Futterkiste</td>
    <td>Germany</td>
  </tr>
  <tr>
    <td>Johnaton snabbkop</td>
    <td>Sweden</td>
  </tr>
  <tr>
    <td>Johnny Trading</td>
    <td>UK</td>
  </tr>
  <tr>
    <td>Johnea Essen</td>
    <td>Germany</td>
  </tr>
  <tr>
    <td>Jon Bacchus Winecellars</td>
    <td>Canada</td>
  </tr>
  <tr>
    <td>Jonny Alimentari Riuniti</td>
    <td>Italy</td>
  </tr>
  <tr>
    <td>North/South</td>
    <td>UK</td>
  </tr>
  <tr>
    <td>Paris specialites</td>
    <td>France</td>
  </tr>
</table>

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Вот вам

Примечание. Я дал столу thead / tbody и переместил ID

window.addEventListener("load", function() {
  document.getElementById("myInput").addEventListener("input", function() {
    const val = this.value.trim().toUpperCase();
    const filter = new RegExp('\\b' + val + '\\b'); // word boundary regex
    const trs = document.querySelectorAll("#myTable tr");
    for (let i = 0; i < trs.length; i++) {
      trs[i].style.display = val ? "none" : "";
      const tds = trs[i].querySelectorAll("td");
      found = false;
      for (let j = 0; j < tds.length; j++) {
        const text = tds[j].textContent.toUpperCase();
        if (filter.test(text)) found = true;
      }
      if (found) trs[i].style.display = "";
    }
  })
})
<input type="text" id="myInput" autocomplete="off" placeholder="Search for names.." title="Type in a name" />

<table>
  <thead>
    <tr class="header">
      <th style="width:60%;">Name</th>
      <th style="width:40%;">Country</th>
    </tr>
  </thead>
  <tbody id="myTable">
    <tr>
      <td>John Futterkiste</td>
      <td>Germany</td>
    </tr>
    <tr>
      <td>Johnaton snabbkop</td>
      <td>Sweden</td>
    </tr>
    <tr>
      <td>Johnny Trading</td>
      <td>UK</td>
    </tr>
    <tr>
      <td>Johnea Essen</td>
      <td>Germany</td>
    </tr>
    <tr>
      <td>Jon Bacchus Winecellars</td>
      <td>Canada</td>
    </tr>
    <tr>
      <td>Jonny Alimentari Riuniti</td>
      <td>Italy</td>
    </tr>
    <tr>
      <td>North/South</td>
      <td>UK</td>
    </tr>
    <tr>
      <td>Paris specialites</td>
      <td>France</td>
    </tr>
  </tbody>
</table>

Только для имен:

window.addEventListener("load", function() {
  document.getElementById("myInput").addEventListener("input", function() {
    const val = this.value.trim().toUpperCase();
    const filter = new RegExp('\\b' + val + '\\b'); // word boundary regex
    const trs = document.querySelectorAll("#myTable tr");
    for (let i = 0; i < trs.length; i++) {
      const text = trs[i].querySelector("td").textContent.toUpperCase(); // or td:first-child
      trs[i].style.display = filter.test(text) ? "" : "none"
    }
  })
})
<input type="text" id="myInput" autocomplete="off" placeholder="Search for names.." title="Type in a name" />

<table>
  <thead>
    <tr class="header">
      <th style="width:60%;">Name</th>
      <th style="width:40%;">Country</th>
    </tr>
  </thead>
  <tbody id="myTable">
    <tr>
      <td>John Futterkiste</td>
      <td>Germany</td>
    </tr>
    <tr>
      <td>Johnaton snabbkop</td>
      <td>Sweden</td>
    </tr>
    <tr>
      <td>Johnny Trading</td>
      <td>UK</td>
    </tr>
    <tr>
      <td>Johnea Essen</td>
      <td>Germany</td>
    </tr>
    <tr>
      <td>Jon Bacchus Winecellars</td>
      <td>Canada</td>
    </tr>
    <tr>
      <td>Jonny Alimentari Riuniti</td>
      <td>Italy</td>
    </tr>
    <tr>
      <td>North/South</td>
      <td>UK</td>
    </tr>
    <tr>
      <td>Paris specialites</td>
      <td>France</td>
    </tr>
  </tbody>
</table>
0 голосов
/ 30 марта 2020

В примере вы найдете функцию indexOf для поиска подстроки, чтобы найти точное совпадение с учетом того, что === не сработает для контракта данных, например (Name Surname), удалить toUpperCase () и разбить строку на whitecase. Поэтому измените условие на:

if (td.innerHTML.split(' ').indexOf(filter) >-1)

Также в ваших данных я вижу такие значения, как North/South, поэтому вам нужны дополнительные разбиения по всем символам разделителя. Или используйте регулярное выражение, чтобы указать все разделители.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...