linq.js – zaznać troszkę C# w javascript

Postawiłem przed sobą dość proste zadanie dodania nowego ‚ficzeru’ do pewnej wewnętrznej ministronki w firmie. Ot, taka mała lista obsługiwanych aplikacji. Z biegiem czasu ‚mutacji’ produktu powstało wiele, dlatego lista stała się dość pokaźna i znalezienie czegoś w niej stało się trudne.

Szczerze mówiąc nie szukałem gotowych rozwiązań problemu, czyli dynamicznej wyszukiwarki (wpisujemy np „Apli” i mamy wyświetlone linki zawierające w anchorze część „Apli”), na pewno bym coś takiego znalazł, jednak czasami fajnie jest napisać coś samemu.

Doszedłem do momentu, w którym pomyślałem „kurde, gdyby w js było linq…” – jest. linq.js to darmowa biblioteczka, która daje nam praktycznie wszystko co najlepsze ze znanego nam dobrze LINQ w .net 🙂

Powiedzmy, że mamy taki oto html:

<input type="text" id="search" />
<ul id="list">
    <li><a href="#">A</a></li>
    <li><a href="#">AB</a></li>
    <li><a href="#">ABC</a></li>
    <li><a href="#">ABC</a></li>
    <li><a href="#">D</a></li>
</ul>

teraz chcemy uzyskać listę linków, które w anchorze będą zawierać tekst wpisany w #search

var text = $('#search').val().toLowerCase();
var links = $('#list li a');
var result = Enumerable.From(links )
    .Where(function (x) { return $(x).text().toLowerCase().indexOf(text)>-1; })
    .OrderBy(function (x) { return $(x).text() })
    .ToArray();

jak widać, możemy korzystać z metod znanych nam z .net + korzystać także z innych bibliotek js, takich jak popularne jQuery 😉

Działający przykład zamieszczam na jsfiddle: http://jsfiddle.net/HGey5/1/ (nie znam na tyle js, ale jeżeli nie robię $(result).clone(), to przy $(‚div’).append(e) kasuje mi elementy z wejściowej listy ul… Nie wiem dlaczego. Z clone() działa 😉 )