Navbar search filter links

BS4 Navbar link filter search bar

HTML

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css">
<div id="link-content">
  <ul class="sidebar-nav navbar-nav">
    <li class="nav-item active">
      <a class="nav-link home" href="#"><i class="fa fa-fw fa-home"></i> Home</a>
    </li>
    <li class="nav-item">
      <label for="nav-search" class="col-2 col-form-label sr-only">Search links</label>
      <div class="col p-2">
        <input class="form-control form-control-sm search-filter" type="search" id="nav-search" placeholder="Search for tools">
      </div>
    </li>
    <li class="nav-item">
      <span class="navbar-brand">Popular tools</span>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#"><i class="fa fa-fw fa-calculator"></i> Calculator</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#"><i class="fa fa-fw fa-battery-3"></i> Battery </a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#"><i class="fa fa-fw fa-database"></i> Pancake Batter</a>
    </li>

    <li class="nav-item">
      <a class="nav-link" href="#"><i class="fa fa-fw fa-clock-o"></i> Marzipan</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#"><i class="fa fa-fw fa-tags"></i> Cakes and Muffins</a>
    </li>
    <li class="nav-item">
      <span class="navbar-brand">Categories</span>
    </li>
    <li class="nav-item">
      <a class="nav-link nav-link-collapse collapsed" data-toggle="collapse" href="#collapseComponents"><i class="fa fa-fw fa-flask"></i> Cars</a>
      <ul class="sidebar-second-level collapse" id="collapseComponents">
        <li>
          <a class="nav-link-collapse collapsed" data-toggle="collapse" href="#collapseMulti2">American</a>
          <ul class="sidebar-third-level collapse" id="collapseMulti2">
            <li>
              <a href="#">Ford</a>
            </li>
 ...

CSS

.navbar-nav.sidebar-nav {
  position: absolute;
  left: 0;
  top: 0;
  margin-top: 56px;
  padding-bottom: 56px;
  height: 100vh;
  background: #292b2c;
  -webkit-flex-direction: column;
  -ms-flex-direction: column;
  flex-direction: column;
  overflow: auto;
}

.navbar-brand {
  display: inline-block;
  padding-top: .25rem;
  padding-bottom: .25rem;
  margin-right: 1rem;
  font-size: 1.25rem;
  line-height: inherit;
  white-space: nowrap;
  color: #fff;
}

.navbar-nav .nav-link {
  color: rgba(255, 255, 255, .5);
}

.hide {
  display: none;
}

JavaScript

$('.search-filter').on('keyup', function() {
  var matches = [];
  var input = $.trim($('.search-filter').val());
  var val = '^(?=.*\\b' + input.split(/\s+/).join('\\b)(?=.*\\b') + ').*$'; // using individual word matching filter from http://stackoverflow.com/a/9127872/1544886
  var filter = RegExp(val, 'i');
  
  if (input.length === 0) { // show all if filter is empty

    $('.collapse').removeClass('show').addClass('collapsed'); // hide collapsable items fast.
    $('.hide').removeClass('hide'); // remove any hidden elements from previous searches
  } else {
    $('.collapse').addClass('show'); // show all collapsed items
    
    $('ul.sidebar-nav a:not(".home")').filter(function() { // skip home <li> so it shows permanently
     	  $this = $(this);
        
        // test for a match to search string
        text = $this.text().replace(/\s+/g, ' ');
        var isMatch = filter.test(text);

				// store match so we can unhide parents of this item 
        if (isMatch) matches.push($this);
               
        return !isMatch;
    }).parent().addClass('hide'); // this hides any <li> that doesn't match search terms. Hiding <a> results in large gaps in the output
    
    $.each(matches, function() { // unhide parents of our matches
    	this.parentsUntil(".sidebar-nav", ".hide").removeClass('hide');
    });
  }
});