Home > Mobile >  jQuery-UI - Autocomplete giving me weird results
jQuery-UI - Autocomplete giving me weird results

Time:02-01

I am using jQuery's autocomplete and its giving me weird results. I am trying to get the results of either the first or last name. Right now if I start typing I only get by last name. Sometimes I get only by first name. Is there a way to do this by both first and last name?

$('#userAutoComplete').autocomplete({
  minLength: 2,
  source: function(request, response) {
    response($.map(sourceValues, function(value, key) {
      var name = value.firstName   " "   value.lastName;
      name = name.toLowerCase();
      console.log(request.term);

      if (name.indexOf(request.term.toLowerCase()) != -1) {
        return {
          label: value.firstName   " "   value.lastName,
          value: value.userId
        }
      } else {
        return null;
      }
    }));
  },
  select: function(event, ui) {
    event.preventDefault();
    $('#userAutoComplete').val(ui.item.label);
    $('#specificUserId').val(ui.item.value);
  }
});

Here is a sample of what sourceValues is:

({userId: 1, firstName: "Bob" lastName: "Smith"}, {userId: 2, firstName: "Mike" lastName: "Garcia"}, {userId: 3, firstName: "Bob" lastName: "Garcia"}, {userId: 4, firstName: "Mike" lastName: "Smith"})

CodePudding user response:

Don't return null - filter() first, map() afterwards.

// this resolves after 2s for demo purposes
const sourceValues = mockAjaxRequest([
  {userId: 1, firstName: "Bob", lastName: "Smith"},
  {userId: 2, firstName: "Mike", lastName: "Garcia"},
  {userId: 3, firstName: "Bob", lastName: "Garcia"},
  {userId: 4, firstName: "Mike", lastName: "Smith"}
], 2000);

$('#userAutoComplete').autocomplete({
  minLength: 2,
  source: function (request, response) {
    const term = request.term.toLowerCase();
    sourceValues.done(values => {
      const matches = values.filter(value => {
        var name = value.firstName   " "   value.lastName;
        return name.toLowerCase().includes(term);
      }).map(value => ({
        label: value.firstName   " "   value.lastName,
        value: value.userId
      }));
      response(matches);
    });
  },
  select: function(event, ui) {
    event.preventDefault();
    $('#userAutoComplete').val(ui.item.label);
    $('#specificUserId').val(ui.item.value);
  }
});

function mockAjaxRequest(value, delay) {
    var req = $.Deferred();
    setTimeout(() => req.resolve(value), delay);
    return req.promise();
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

<input id="userAutoComplete">
<input id="specificUserId" readonly>

  •  Tags:  
  • Related