DataTables

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/css/dataTables.bootstrap4.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/jquery.dataTables.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/dataTables.bootstrap4.min.js"></script>


<select class="custom-select custom-select-sm form-control form-control-sm mr-3" id="officeFilter">
    <option value="">No filter</option>
    <option value="London" selected>London</option>
    <option value="San Francisco">San Francisco</option>
    <option value="New York">New York</option>
    <option value="Sydney">Sydney</option>
</select>

<table id="example" class="display" width="100%">
    <thead>
        <tr>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Age</th>
            <th>Start date</th>
            <th>Salary</th>
        </tr>
    </thead>
</table>

CSS

#officeFilter {
  max-width: 135px;
}

JavaScript

$(document).ready(function() {
  InitializeDatatable();
  InitializeCodesDatatableSeachPlugin();

  $('#officeFilter').on('change', function() {
    $('#example').DataTable().draw();
  });
  $('#example').DataTable().draw();
});

function InitializeDatatable() {
  let ajaxData = GetAjaxData();
  var table = $('#example').DataTable({
    data: ajaxData,
    dom: "<'row'<'col-sm-12 col-md-8 toolbar d-flex flex-wrap'l><'col-sm-12 col-md-4'f>>" +
      "<'row'<'col-sm-12'tr>>" +
      "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
    columns: [{
        "data": "name"
      },
      {
        "data": "position"
      },
      {
        "data": "office"
      },
      {
        "data": "extn"
      },
      {
        "data": "start_date"
      },
      {
        "data": "salary"
      }
    ],
    deferRender: true,
    scrollX: true
  });

  $("div.toolbar").prepend($('#officeFilter'));
}

function InitializeCodesDatatableSeachPlugin() {
  //info about this search plugin: https://datatables.net/forums/discussion/64685/how-to-filter-hidden-column-by-dropdown-value-but-ignore-column-in-global-filter
  $.fn.dataTable.ext.search.push(
    function(settings, searchData, index, rowData, counter) {
      var searchVal = $('#officeFilter').val();
      console.log(searchVal)
      // Show all rows if select is empty - 'all'
      if (searchVal === '') {
        return true;
      }

      // Show only rows that match the select value
      if (searchVal === rowData['office'].toString()) {
        return true;
      }

      // Filter row if it doesn't match.
      return false;
    }
  );
}


function GetAjaxData() {
  let data = [{
      "id": "1",
      "name": "Tiger Nixon",
      "position": "System Architect",
      "salary": "$320,800",
      "start_date": "2011/04/25",
      "office": "Edinburgh",
      "extn": "5421"
    },
    {
      "id": "2",
      "name": "Garrett Winters",
      "position": "Accountant",
      "salary": "$170,750",
     ...