2013-01-09 12 views
6

Tutaj jest luka w mojej wiedzy o JavaScript. Chcę przeszukać tablicę wartości obiektów dla określonej wartości i zwrócić ją.Javascript wydajna tablica wyszukiwania dla wartości z jQuery

Za rok Pisałem JavaScript, jakie realizuje to tak:

var itemClicked = (function(){ 

    var retval; 

    //Note self.inventory.itemsArray is an array of JS objects 

    $(self.inventory.itemsArray).each(function(i){ 
    if(parseInt(this.id) === parseInt(idOfItem)){ 
     retval = this; 
     return false; 
    } 
    }); 

    return retval; 

})(); 

To działa, ale jestem pewien, jak wszystko jest bardziej elegancki sposób. Powiedz mi proszę!

EDIT - Rozwiązanie

Dzięki @gdoron z poniższej jego odpowiedź.

var myVar = $(self.owner.itemsArray).filter(function(){ 
    return parseInt(this.id) == parseInt(recItemID); 
}).get(0); 

Uwaga: .get(0) dodano na końcu, gdyż myVar owija się jako obiekt jQuery.

+0

Zdefiniuj "* bardziej efektywny *." Niektórzy źle zrozumieją "* mniej znaków *" – Alexander

+1

Więc 'self.inventory.itemsArray' jest tablicą selektorów lub obiektów jQuery? – elclanrs

+0

dlaczego nie indeksować tablicy według identyfikatora? Wystarczy, że zrobisz "return self.inventory".itemsArray [id] 'i całkowicie unikaj pętli. –

Odpowiedz

14

Funkcja rodzimy jQuery tego jest filter:

$(data).filter(function(){ 
    return this.id == "foo"; 
}); 

To krócej niż kod masz ważniejsze dużo bardziej czytelny.
O efektywności, iteracji wszystkie elementy w zestawie, aby znaleźć jak najwięcej pasuje, ale trudno uwierzyć, że będzie to wąskie gardło aplikacji, nie skupiać się na mikro-optymalizacji.

Sugeruję przeczytanie bloga Eric Lipper o numerze Which is faster.

Można również użyć grep jak sugeruje @Mattias Buelens:

$.grep(data, function(ele){ 
    retun ele.id == "foo"; 
}); 
+3

Natywny dla jq, nie pochodzi z języka. Możesz być bardziej precyzyjny. –

+2

@gustafr, Wierzę, że to oczywiste, ale dodam to. – gdoron

+0

To rozwiązanie niepotrzebnie opakowuje jednak tablicę w obiekt jQuery. '$ .find' zamienia się na' jQuery.grep' podczas przekazywania funkcji, więc lepiej jest użyć 'grep' bezpośrednio, jak pokazano w @Bruno. –

0

Choć jestem pewien, co funkcja jest faktycznie robić (z powodu zmiennych kontekstów zewnętrznych), następujące powinny być bardziej wydajny cykl mądry

var itemClicked = (function(){ 

    var i, array = self.inventory.itemsArray, length = array.length; 

    for(i=0; i < length; i++) { 

    if(parseInt(array[i].id) === parseInt(idOfItem)){ 
     return array[i]; 
    } 

    } 

    return undefined; 

})(); 
0

Jest tablicą JavaScript obiektów

Następnie nie używaj jQuery w ogóle. Przynajmniej używaj $.each zamiast budować obiekt otoki wokół tablicy. Mimo to, prosty dla pętli jest znacznie krótsza i bardziej wydajnych:

var itemClicked = (function(idnum) { 
    var arr = self.inventory.itemsArray; 
    for (var i=0, l=arr.length; i<l; i++) 
     if (parseInt(arr[i].id, 10) === idnum) 
      return arr[i]; 
})(parseInt(idOfItem, 10)); 

Równie dobrze można pomyśleć przechowywania właściwości id jak numery od razu, więc nie ma potrzeby, aby przekształcić go za każdym razem.

4

Kolejna opcja korzystania $.grep() funkcja jQuery

var arr = $.grep(self.inventory.itemsArray, function (n) { 
    return n.id == idOfItem; 
}); 

Powyższe zwraca tablicę dopasowanie elementów tablicy. Jeśli po prostu chcesz pierwszy, łatwo jest zwrócić arr[0], jeśli istnieje.

+0

Czy grep nie zwraca tablicy zamiast pierwszego pasującego obiektu? – Bergi

+1

W przeciwieństwie do '$ .filter',' jQuery.grep' nie niepotrzebnie nie owija tablicy w obiekt jQuery. Oba rozwiązania wciąż jednak znajdują * wszystkie * pasujące elementy. Nie mogę znaleźć natywnej metody 'Array' lub funkcji jQuery, która może zatrzymać wyszukiwanie po pierwszym dopasowaniu. –

+0

@MattiasBuelens, 'each', gdy zwraca false, zatrzymuje iteracje. chociaż nadal będę używał 'filtru', ponieważ jest on dużo czytelniejszy. – gdoron

Powiązane problemy