I've accomplished adding multiple keywords to the filter, but they work on items in the list containing both keywords. I would like to create a filter where any item in the list can match either or of the keywords. eg:
<input id="myInput" type="text" placeholder="Search any keywords">
<button id="mySearchBtn">search</button>    
<ul> 
    <li>Red</li>
    <li>Green</li>
    <li>Blue</li>
</ul>
Search Input: Red Green
Result:
Here is my JQuery search function that allows multiple keywords. The search function only yields the last result of the items, but allows multiple keywords.
$("#mySearchBtn").click(function() {
  var value = $('#myInput').val().toLowerCase();
  var values = value.split(" ");
  var length = values.length
  var cards = $(".card-col-wrapper")
  for (j = 0; j < cards.length; j++) {
    for (i = 0; i < length; i++) {
      $(".card-col-wrapper").filter(function() {
        $(this).toggle($(this).text().toLowerCase().indexOf(values[i]) > -1)
      });
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<input id="myInput" type="text" placeholder="Search any keywords">
<button id="mySearchBtn">search</button>
<div class="card-col-wrapper">
  <h3>one</h3>
</div>
<div class="card-col-wrapper">
  <h3>two</h3>
</div>
<div class="card-col-wrapper">
  <h3>three</h3>
</div>
Input: one two
Result: two
How can I edit my search function to have the result of both "one" and "two"?
You can filter an array by the contents of another array like:
console.log(
  ['a', 'b', 'c', 'd', 'e', 'f'].filter(
    char => ['b', 'e'].includes(char)
  )
)
This means that in your case, you would do something like:
$("#mySearchBtn").click(function() {
    const words = $('#myInput').val().toLowerCase().split(/\s+/g);
            
    $(".card-col-wrapper h3").each(function () {
      if (words.includes($(this).text())) {
        $(this).show();
      } else {
        $(this).hide();
      }
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<input id="myInput" type="text" placeholder="Search any keywords">
<button id="mySearchBtn">search</button>
<div class="card-col-wrapper">
  <h3>one</h3>
</div>
<div class="card-col-wrapper">
  <h3>two</h3>
</div>
<div class="card-col-wrapper">
  <h3>three</h3>
</div>
Use Array#includes to see if the text exists. Also you need to use String#trim to ensure there is not extra spacing.
$("#mySearchBtn").click(function() {
  const value = $('#myInput').val().toLowerCase();
  const values = value.toLowerCase().split(" ");
  const $cards = $(".card-col-wrapper");
  const res = $cards.filter((i, ele) => {
    return values.includes($(ele).text().toLowerCase().trim());
  });
  $(res).toggle();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="myInput" type="text" placeholder="Search any keywords">
<button id="mySearchBtn">search</button>
<div class="card-col-wrapper">
  <h3>one</h3>
</div>
<div class="card-col-wrapper">
  <h3>two</h3>
</div>
<div class="card-col-wrapper">
  <h3>three</h3>
</div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With