dennisnoodle
dennisnoodle

Reputation: 25

How can I merge these two into one function of Javascript?

I am using the following code to allow users to search and filter a HTML table.

function searchFilter(event) {
  var filter = event.target.value.toUpperCase();
  var rows = document.querySelector("#filterTable tbody").rows;

  for (var i = 0; i < rows.length; i++) {
    var secondCol = rows[i].cells[1].textContent.toUpperCase();
    var thirdCol = rows[i].cells[2].textContent.toUpperCase();
    var fourthCol = rows[i].cells[3].textContent.toUpperCase();
    var sixthCol = rows[i].cells[5].textContent.toUpperCase();
    var seventhCol = rows[i].cells[6].textContent.toUpperCase();
    var eighthCol = rows[i].cells[7].textContent.toUpperCase();
    if (secondCol.indexOf(filter) > -1 || thirdCol.indexOf(filter) > -1 || fourthCol.indexOf(filter) > -1 || sixthCol.indexOf(filter) > -1 || seventhCol.indexOf(filter) > -1 || eighthCol.indexOf(filter) > -1) {
      rows[i].style.display = "";
    } else {
      rows[i].style.display = "none";
    }
  }
}

document.querySelector('#driverSearch').addEventListener('keyup', searchFilter, false);
<section id="chronology">
  <h2 id="chronology">Chronology</h2>
  <div class="search-box">
    <input type="text" id="driverSearch" placeholder="Search...">
  </div>
  <div class="scroll">
    <table class="chronology sortable full-width" id="filterTable">
      <thead>
        <tr>
          <th scope="col">No.</th>
          <th scope="col">Year</th>
          <th scope="col">Grand Prix</th>
          <th scope="col">Circuit</th>
          <th scope="col">Race No.</th>
          <th scope="col">Constructor</th>
          <th scope="col">Chassis</th>
          <th scope="col">Engine</th>
          <th class="align-r" scope="col">Start</th>
          <th class="align-r" scope="col">Win margin</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th class="row-header" scope="row">1</th>
          <td>2007</td>
          <td sorttable_customkey="Canada"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Canada.png" alt="Canada flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-canadian-grand-prix/">Canada</a></td>
          <td>Montreal</td>
          <td>6</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">4.343s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">2</th>
          <td>2007</td>
          <td sorttable_customkey="USA"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/United-States.png" alt="USA flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-united-states-grand-prix/">USA</a></td>
          <td>Indianapolis</td>
          <td>7</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">1.518s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">3</th>
          <td>2007</td>
          <td sorttable_customkey="Hungary"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Hungary.png" alt="Hungary flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-hungarian-grand-prix/">Hungary</a></td>
          <td>Hungaroring</td>
          <td>11</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">0.715s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">4</th>
          <td>2007</td>
          <td sorttable_customkey="Japan"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Japan.png" alt="Japan flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-japanese-grand-prix/">Japan</a></td>
          <td>Fuji</td>
          <td>15</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">8.377s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">5</th>
          <td>2008</td>
          <td sorttable_customkey="Australia"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Australia.png" alt="Australia flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2008-world-championship/2008-australian-grand-prix/">Australia</a></td>
          <td>Melbourne</td>
          <td>18</td>
          <td>McLaren</td>
          <td>MP4-23</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">5.478s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">6</th>
          <td>2008</td>
          <td sorttable_customkey="Monaco"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Monaco.png" alt="Monaco flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2008-world-championship/2008-monaco-grand-prix/">Monaco</a></td>
          <td>Monte Carlo</td>
          <td>23</td>
          <td>McLaren</td>
          <td>MP4-23</td>
          <td>Mercedes V8</td>
          <td class="third-hl align-r">3</td>
          <td class="align-r">3.064s</td>
        </tr>
    </table>
  </div>

In the third column I am having some trouble. This column contains both img tags and anchor tags. Within the img tags the source link contains date formats such as: /uploads/2018/09/Spain.png.

The second column of my table is a year column. When users filter the table by year every year works apart from 2018. Because every image was uploaded in 2018, if a user wants to filter the table to show only 2018 entries the table shows every row despite the year. For example, the year 2002 will show up when you search for 2018. I know why, it's because the 2018 in the url is being accounted for.

I need just the text from the anchor, which led me to the following code:

rows[0].cells[2].getElementsByTagName("a")[0].textContent

If I replace var thirdCol = rows[i].cells[2].textContent.toUpperCase();with

rows[0].cells[2].getElementsByTagName("a")[0].textContent

the 2018 problem goes away. If you search for 2018 only results with 2018 in the second column are shown. However, if you search for any text from the third column the filter returns no results at all.

So, can rows[0].cells[2].getElementsByTagName("a")[0].textContent be added to the initial function in anyway to make the two work together? Or is there another way for me to do this?

Upvotes: 2

Views: 92

Answers (2)

Andy
Andy

Reputation: 63524

It would be slightly easier to iterate over the cell data and if there's no match (I'm using some to return a boolean if there's text in any cell that matches the filter) hide the row. That way you don't have to manually check each cell with its index.

// Cache the rows outside of the searchFilter function
const rows = document.querySelectorAll("#filterTable tr");

// Add a reset function that removes the hide class
// from all the rows
function reset() {
  rows.forEach(row => row.classList.remove('hide'));
}

function searchFilter(event) {

  const filter = event.target.value.toUpperCase();

  // If the string is empty reset
  if (!filter) {
    reset();
  } else {

    // Otherwise iterate over each row
    rows.forEach((row, i) => {

      // Grab all the cells from the row
      const cells = Array.from(row.querySelectorAll('td'));

      // Use `some` to check each text of the cell
      // (note you have to use `trim` to get rid
      // of whitespace otherwise an exact match won't be found
      const foundFilter = cells.some(cell => {
        const cellText = cell.textContent.trim().toUpperCase();
        return cellText === filter;
      });

      // If a match was found remove the hide class,
      // otherwise add it
      if (foundFilter) {
        row.classList.remove('hide');
      } else {
        row.classList.add('hide');
      }
    });
  }

}

document.querySelector('#driverSearch').addEventListener('keyup', searchFilter, false);
.hide { visibility: hidden; }
<section id="chronology">
  <h2 id="chronology">Chronology</h2>
  <div class="search-box">
    <input type="text" id="driverSearch" placeholder="Search...">
  </div>
  <div class="scroll">
    <table class="chronology sortable full-width" id="filterTable">
      <thead>
        <tr>
          <th scope="col">No.</th>
          <th scope="col">Year</th>
          <th scope="col">Grand Prix</th>
          <th scope="col">Circuit</th>
          <th scope="col">Race No.</th>
          <th scope="col">Constructor</th>
          <th scope="col">Chassis</th>
          <th scope="col">Engine</th>
          <th class="align-r" scope="col">Start</th>
          <th class="align-r" scope="col">Win margin</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th class="row-header" scope="row">1</th>
          <td>2007</td>
          <td sorttable_customkey="Canada"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Canada.png" alt="Canada flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-canadian-grand-prix/">Canada</a></td>
          <td>Montreal</td>
          <td>6</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">4.343s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">2</th>
          <td>2007</td>
          <td sorttable_customkey="USA"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/United-States.png" alt="USA flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-united-states-grand-prix/">USA</a></td>
          <td>Indianapolis</td>
          <td>7</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">1.518s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">3</th>
          <td>2007</td>
          <td sorttable_customkey="Hungary"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Hungary.png" alt="Hungary flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-hungarian-grand-prix/">Hungary</a></td>
          <td>Hungaroring</td>
          <td>11</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">0.715s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">4</th>
          <td>2007</td>
          <td sorttable_customkey="Japan"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Japan.png" alt="Japan flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-japanese-grand-prix/">Japan</a></td>
          <td>Fuji</td>
          <td>15</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">8.377s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">5</th>
          <td>2008</td>
          <td sorttable_customkey="Australia"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Australia.png" alt="Australia flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2008-world-championship/2008-australian-grand-prix/">Australia</a></td>
          <td>Melbourne</td>
          <td>18</td>
          <td>McLaren</td>
          <td>MP4-23</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">5.478s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">6</th>
          <td>2008</td>
          <td sorttable_customkey="Monaco"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Monaco.png" alt="Monaco flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2008-world-championship/2008-monaco-grand-prix/">Monaco</a></td>
          <td>Monte Carlo</td>
          <td>23</td>
          <td>McLaren</td>
          <td>MP4-23</td>
          <td>Mercedes V8</td>
          <td class="third-hl align-r">3</td>
          <td class="align-r">3.064s</td>
        </tr>
    </table>
  </div>

Upvotes: 1

navnath
navnath

Reputation: 3714

Use var thirdCol = rows[i].cells[2].getElementsByTagName("a")[0].textContent.toUpperCase();

function searchFilter(event) {
  var filter = event.target.value.toUpperCase();
  var rows = document.querySelector("#filterTable tbody").rows;

  for (var i = 0; i < rows.length; i++) {
    var secondCol = rows[i].cells[1].textContent.toUpperCase();
    //var thirdCol = rows[i].cells[2].textContent.toUpperCase();
    var thirdCol = rows[i].cells[2].getElementsByTagName("a")[0].textContent.toUpperCase();
    var fourthCol = rows[i].cells[3].textContent.toUpperCase();
    var sixthCol = rows[i].cells[5].textContent.toUpperCase();
    var seventhCol = rows[i].cells[6].textContent.toUpperCase();
    var eighthCol = rows[i].cells[7].textContent.toUpperCase();
    if (secondCol.indexOf(filter) > -1 || thirdCol.indexOf(filter) > -1 || fourthCol.indexOf(filter) > -1 || sixthCol.indexOf(filter) > -1 || seventhCol.indexOf(filter) > -1 || eighthCol.indexOf(filter) > -1) {
      rows[i].style.display = "";
    } else {
      rows[i].style.display = "none";
    }
  }
}

document.querySelector('#driverSearch').addEventListener('keyup', searchFilter, false);
<section id="chronology">
  <h2 id="chronology">Chronology</h2>
  <div class="search-box">
    <input type="text" id="driverSearch" placeholder="Search...">
  </div>
  <div class="scroll">
    <table class="chronology sortable full-width" id="filterTable">
      <thead>
        <tr>
          <th scope="col">No.</th>
          <th scope="col">Year</th>
          <th scope="col">Grand Prix</th>
          <th scope="col">Circuit</th>
          <th scope="col">Race No.</th>
          <th scope="col">Constructor</th>
          <th scope="col">Chassis</th>
          <th scope="col">Engine</th>
          <th class="align-r" scope="col">Start</th>
          <th class="align-r" scope="col">Win margin</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th class="row-header" scope="row">1</th>
          <td>2007</td>
          <td sorttable_customkey="Canada"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Canada.png" alt="Canada flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-canadian-grand-prix/">Canada</a></td>
          <td>Montreal</td>
          <td>6</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">4.343s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">2</th>
          <td>2007</td>
          <td sorttable_customkey="USA"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/United-States.png" alt="USA flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-united-states-grand-prix/">USA</a></td>
          <td>Indianapolis</td>
          <td>7</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">1.518s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">3</th>
          <td>2007</td>
          <td sorttable_customkey="Hungary"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Hungary.png" alt="Hungary flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-hungarian-grand-prix/">Hungary</a></td>
          <td>Hungaroring</td>
          <td>11</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">0.715s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">4</th>
          <td>2007</td>
          <td sorttable_customkey="Japan"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Japan.png" alt="Japan flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2007-world-championship/2007-japanese-grand-prix/">Japan</a></td>
          <td>Fuji</td>
          <td>15</td>
          <td>McLaren</td>
          <td>MP4-22</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">8.377s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">5</th>
          <td>2008</td>
          <td sorttable_customkey="Australia"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Australia.png" alt="Australia flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2008-world-championship/2008-australian-grand-prix/">Australia</a></td>
          <td>Melbourne</td>
          <td>18</td>
          <td>McLaren</td>
          <td>MP4-23</td>
          <td>Mercedes V8</td>
          <td class="first-hl align-r">1</td>
          <td class="align-r">5.478s</td>
        </tr>
        <tr>
          <th class="row-header" scope="row">6</th>
          <td>2008</td>
          <td sorttable_customkey="Monaco"><img src="https://gpracingstats.com/wp-content/uploads/2018/09/Monaco.png" alt="Monaco flag" class="flag" width="24" height="16" /> <a href="https://gpracingstats.com/seasons/2008-world-championship/2008-monaco-grand-prix/">Monaco</a></td>
          <td>Monte Carlo</td>
          <td>23</td>
          <td>McLaren</td>
          <td>MP4-23</td>
          <td>Mercedes V8</td>
          <td class="third-hl align-r">3</td>
          <td class="align-r">3.064s</td>
        </tr>
    </table>
  </div>

Upvotes: 1

Related Questions