Убрать лишние строки в таблице javascript

Есть таблица:

<table class="s-table">
  <tr>
    <th>mac</th>
    <th>name</th>
    <th>port</th>
    <th>manufacter</th>
  </tr>
  </thead>
  <tbody>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>21</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>21</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>23</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>19</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
  </tbody>
</table>

Задача состоит в том, чтобы с помощью Javascipt из данной таблицы убрать строки с портом 25 (остальные оставить) с помощью чекбокса, подскажите знающие в какую сторону стоит капать?


Ответы (2 шт):

Автор решения: De.Minov

Допустим так.

let table = document.querySelector('.s-table'),
    filter = document.querySelector('.port-filter'),
    rowsPort = {}; // Тут будем хранить массив элементов TR по значению TR > TH[2] === который равен колонке port

// Формируем объект с портами
[...table.querySelectorAll('tbody > tr')].map(e => { // Проходим по всем строкам
  let id = e.querySelectorAll('td')[2].innerText; // Получаем значение колонки port
  if(!rowsPort[id]) rowsPort[id] = []; // Если такого значения ещё нет в объекте, то создаём под него массив
  rowsPort[id].push(e); // И пушим туда всю строку
});

// Формируем вывод фильтров
for(let item in rowsPort) { // Проходим циклом по объекту
  filter.innerHTML += `<br><label for="rows-filter-${item}">${item}</label> - <input id="rows-filter-${item}" data-id="${item}" type="checkbox" checked/>` // Создаём разметку. Inputу в data-id передаём значение ключа, чтобы проще было её получать в механике фильтра
}

// Механика фильтра
filter.addEventListener('click', e => { // При клике на область блока
  if(e.target.tagName === 'INPUT') { // Проверяем, было ли нажатие по INPUT (вернёт, даже если нажмём на label, чей for соответствует id inputа)
    let input = e.target, // получаем элемент
        id = input.getAttribute('data-id'); // получаем его ID

    rowsPort[id].map(e => e.style.display = input.checked ? '' : 'none'); // Проходим по всем строкам, что находятся rowsPort[data-id], и скрываем или отображаем, в зависимости от input.checked, через display
  }
});
<div class="port-filter">Filter port:</div>
<hr>
<table class="s-table">
  <thead>
    <tr>
      <th>mac</th>
      <th>name</th>
      <th>port</th>
      <th>manufacter</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>21</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>21</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>23</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>19</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
  </tbody>
</table>


Чтобы разово убрать только строки с портом 25, то так:

[...document.querySelectorAll('.s-table > tbody > tr')].map(e => { // Проходим по строкам
  let value = e.querySelectorAll('td')[2].innerText; // Получаем значение ячейки, которая равна ячейке port
  if(value === '25') e.style.display = 'none'; // или e.remove();
});
<table class="s-table">
  <thead>
    <tr>
      <th>mac</th>
      <th>name</th>
      <th>port</th>
      <th>manufacter</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>21</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>21</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>23</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>19</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
  </tbody>
</table>

→ Ссылка
Автор решения: Qwertiy

for (let td of document.querySelectorAll("td:nth-child(3)")) {
  td.closest("tr").dataset.port = +td.textContent
}
#show25:not(:checked) ~ .s-table [data-port="25"] {
  display: none;
}
<input type="checkbox" id="show25"><label for="show25"> Show port 25</label>

<table class="s-table">
  <thead>
    <tr>
      <th>mac</th>
      <th>name</th>
      <th>port</th>
      <th>manufacter</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>21</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>21</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>23</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>19</td>
      <td>Intel Corporation</td>
    </tr>
    <tr>
      <td>00:07:e9:32:e5:58</td>
      <td>Switch90</td>
      <td>25</td>
      <td>Microsoft Corporation</td>
    </tr>
  </tbody>
</table>

→ Ссылка