2011-10-30 8 views
9

w całości w JS, bez serwera zaplecza. Chcę zezwolić użytkownikowi na wyszukiwanie, a następnie wyświetlenie listy dopasowanych nazw. Korzystam z AutoComplete jQuery UI, ale potrzebuję niektórych JS do filtrowania wyników.Użycie JS/jQuery do wyszukiwania ciągów/dopasowywania rozmytego?

Biorąc pod tablicę nazw:

Bob Hope 
James Jones 
Steve Jobs 
Larry McBridge 

Biorąc pod uwagę termin wyszukiwania podobne Bo

Jak mogę uzyskać tylko Bob Hope wrócić

Biorąc pod uwagę termin Search jak b:

Jak mogę zdobyć wszystkie oprócz James Jones?

Każdy prosty JS do porównywania dwóch ciągów znaków? Dzięki

+0

na rzecz przyszłych czytelników, zaimplementowałem bibliotekę właśnie na to: http: // g ithub.com/uohzxela/fuzzy-autocomplete – uohzxela

+0

@uohzxela - Dla dobra mnie, przyjechałem tutaj, aby ** uniknąć ** korzystania z biblioteki (miał ich dość). Ponadto szybkie spojrzenie na twoje trafienia zostało wykonane dla bardzo specyficznego przypadku użycia i jest mało prawdopodobne, aby pomóc wielu deweloperom – vsync

Odpowiedz

7
var names = ["Bob Hope","James Jones","Steve Jobs","Larry McBridge"] 
var query = "bo" 
var results = $(names) 
     .map(function(i,v){ 
      if(v.toLowerCase().indexOf(query.toLowerCase())!=-1){return v} 
     }).get() 

// results is ["Bob Hope"] 
+0

Więc przetestować pojedynczy ciąg, jeśli (stringToSearch.toLowerCase(). IndexOf (stringQuery.toLowerCase())! -1) {alert ("dopasuj"); } –

1

Być może źle Cię zrozumiałem (biorąc pod uwagę złożoność powyższej odpowiedzi), ale wymyśliłem this, który używa jQuery. Za każdym naciśnięciem klawisza (gdy fokus jest aktywny), przeszukuje wszystkie elementy znajdujące się na stronie i stwierdza, czy zawierają wyszukiwane hasło.

Oto HTML:

<ul><li>Bob Hope</li> 
<li>James Jones</li> 
<li>Steve Jobs</li> 
<li>Larry McBridge</li></ul><br> 
Search: <input id="search" length="24" /> 

I tutaj jest jQuery:

$("#search").keyup(function(){ 
    $("li").hide(); 
    var term = $(this).val(); 
    $("li:contains('" + term + "')").show(); 
}); 
0

Korzystanie odpowiedź Iwana, ale ze zmianami ES6:

var names = ["Bob Hope","James Jones","Steve Jobs","Larry McBridge"]; 

function findIn(s, list){ 
    return list.filter((v) => v.toLowerCase().indexOf(s.toLowerCase()) != -1); 
} 


findIn('bo', names); 
Powiązane problemy