Użyj find()
metody:
myArray.find(x => x.id === '45').foo;
Z MDN :
find()
Sposób powraca do pierwszej wartości w tablicy, a element w tablicy spełnia podaną funkcję testowania. W przeciwnym razie undefined
jest zwracany.
Jeśli zamiast tego chcesz znaleźć jego indeks , użyj findIndex()
:
myArray.findIndex(x => x.id === '45');
Z MDN :
findIndex()
Metoda zwraca wskaźnik pierwszego elementu w tablicy, który spełnia podane funkcji testowych. W przeciwnym razie zwracane jest -1.
Jeśli chcesz uzyskać tablicę pasujących elementów, użyj filter()
metody:
myArray.filter(x => x.id === '45');
Zwróci to tablicę obiektów. Jeśli chcesz uzyskać tablicę foo
właściwości, możesz to zrobić za pomocą map()
metody:
myArray.filter(x => x.id === '45').map(x => x.foo);
Uwaga dodatkowa: metody takie jak find()
i filter()
oraz funkcje strzałek nie są obsługiwane przez starsze przeglądarki (takie jak IE), więc jeśli chcesz obsługiwać te przeglądarki, powinieneś przetłumaczyć swój kod za pomocą Babel (z polifill ).
Michał Perłakowski
źródło
Ponieważ już używasz jQuery, możesz użyć funkcji grep, która jest przeznaczona do przeszukiwania tablicy:
Wynikiem jest tablica ze znalezionymi elementami. Jeśli wiesz, że obiekt jest zawsze obecny i że występuje tylko raz, możesz użyć
result[0].foo
tej wartości, aby uzyskać wartość. W przeciwnym razie powinieneś sprawdzić długość wynikowej tablicy. Przykład:źródło
===
zamiast==
, aby uniknąć dziwne problemy z JavaScript w==
operatora.e.id
iid
będzie struny, przypuszczam, że jest ok do użytku==
. Ale jeśli nie jesteś pewien, możesz napotkać problemy (ponieważ'' == 0
jest,true
ale'' === 0
jestfalse
). Nie wspominając o tym,===
że wydaje się być szybszy ( stackoverflow.com/questions/359494/… ).===
ponieważ działa dokładnie tak , jak==
w innych językach programowania. Uważam, że==
JavaScript nie istnieje.Innym rozwiązaniem jest utworzenie obiektu odnośnika:
Jest to szczególnie interesujące, jeśli musisz wykonać wiele wyszukiwań.
Nie będzie to wymagało więcej pamięci, ponieważ identyfikatory i obiekty będą udostępniane.
źródło
lookup
obiektu to strata czasu.ECMAScript 2015 zapewnia metodę find () tablic:
Działa bez bibliotek zewnętrznych. Ale jeśli chcesz obsługiwać starszą przeglądarkę, możesz dołączyć tę funkcję wypełniania .
źródło
myArray.find(d=>d.id===45).foo;
.myArray.find(({ id }) => id === 45).foo
. Ale to stara odpowiedź, która została napisana, zanim składnia ES2015 była równie dobrze obsługiwana, jak teraz. @ Gothdo za odpowiedź jest obecnie najbardziej aktualne w wątku.myArray.find(d => d.id === 45)?.foo
.Underscore.js ma dobrą metodę:
źródło
Myślę, że najprostszym sposobem byłoby, ale nie będzie działać w Internet Explorerze 8 (lub wcześniejszym):
źródło
for
?for
pętlą.for
pętla kończy się przy pierwszym dopasowaniu.id
Spróbuj wykonać następujące czynności
źródło
źródło
Ogólna i bardziej elastyczna wersja powyższej funkcji findById:
źródło
Możesz to łatwo uzyskać za pomocą funkcji map () :
Przykład roboczy: http://jsfiddle.net/hunter/Pxaua/
źródło
map
automatycznie usuwanull
elementy. Brzmi myląco dla mnie i dla wspólnej koncepcjimap
, ponieważ wynik nie ma takiej samej długości oryginalnej kolekcji.Możesz użyć filtrów,
źródło
Chociaż jest tutaj wiele poprawnych odpowiedzi, wiele z nich nie odnosi się do faktu, że jest to niepotrzebnie kosztowna operacja, jeśli jest wykonywana więcej niż jeden raz. W skrajnym przypadku może to być przyczyną rzeczywistych problemów z wydajnością.
W prawdziwym świecie, jeśli przetwarzasz wiele elementów, a problemem jest wydajność, znacznie szybciej jest początkowo zbudować wyszukiwanie:
następnie możesz dostać się na przedmioty w ustalonym czasie, takie jak to:
Możesz również rozważyć użycie mapy zamiast obiektu jako odnośnika: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
źródło
Używanie natywnego
Array.reduce
zwraca element obiektu, jeśli zostanie znaleziony, w przeciwnym razie
false
źródło
Jeśli zrobisz to wiele razy, możesz skonfigurować mapę (ES6):
Następnie możesz po prostu zrobić:
źródło
Oto jak poradzę sobie z tym w czystym JavaScript, w najbardziej minimalistyczny sposób, jaki mogę wymyślić, działa w ECMAScript 3 lub nowszym. Zwraca się, gdy tylko zostanie znalezione dopasowanie.
źródło
Bardziej ogólny i krótki
w twoim przypadku np.
var element = findFromArray(myArray,'id',45)
to da ci cały element.źródło
Możesz wypróbować Sugarjs ze strony http://sugarjs.com/ .
Ma bardzo słodki sposób na tablicach,
.find
. Możesz więc znaleźć element taki jak ten:Możesz także przekazać obiekt o większej liczbie właściwości, aby dodać kolejną „klauzulę where”.
Zauważ, że Sugarjs rozszerza rodzime obiekty, a niektórzy uważają to za bardzo złe ...
źródło
find
. Moja sugestia jest taka, że jeśli chcesz rozszerzyć prototypy natywne, zawsze używaj bardziej szczegółowych nazw, pozostawiając najprostsze dla przyszłych standardowych rozwiązań.Opierając się na przyjętej odpowiedzi:
jQuery:
Lub CoffeeScript:
źródło
Ostatnio muszę zmierzyć się z tym samym, w którym muszę przeszukać ciąg z ogromnej tablicy.
Po kilku poszukiwaniach znalazłem, że będzie to łatwe w obsłudze za pomocą prostego kodu:
Kod:
Zobacz https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/
źródło
Iteruj po dowolnym elemencie w tablicy. Dla każdego odwiedzanego elementu sprawdź jego identyfikator. Jeśli pasuje, zwróć go.
Jeśli chcesz tylko kod:
I to samo przy użyciu metod macierzy ECMAScript 5:
źródło
Tak długo, jak przeglądarka obsługuje ECMA-262 , piąta edycja (grudzień 2009 r.), Powinno to działać prawie w jednym wierszu:
źródło
bFound
jest tylko wartością logiczną, która oznacza,true
że element spełnia wymagany warunek.Możesz to zrobić nawet w czystym JavaScript, używając wbudowanej funkcji „filtrowania” tablic:
Teraz po prostu podaj „id” zamiast
key
„45” zamiastvalue
, a otrzymasz pełny obiekt pasujący do identyfikatora 45. Tak więc,źródło
Użyj
Array.prototype.filter()
funkcji.DEMO : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON
FILTR
źródło
.filter
metodyobj.info
w zagnieżdżonej pętli.var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Możemy użyć metod Jquery
$.each()/$.grep()
lub
użyj składni ES6:
Lub użyj Lodash https://lodash.com/docs/4.17.10#filter , Underscore https://underscorejs.org/#filter
źródło
Naprawdę podobała mi się odpowiedź udzielona przez Aarona Digullę, ale musiałem zachować mój zestaw obiektów, aby móc ją później iterować. Więc zmodyfikowałem to do
źródło
Posługiwać się:
Powinien zwrócić obiekt według identyfikatora.
źródło
To rozwiązanie może być również pomocne:
Zrobiłem to tak,
$.grep
a jeśli jeden obiekt zostanie znaleziony, funkcja zwróci obiekt, a nie tablicę.źródło
function will return the object, rather than an array
może popełnić błąd, ale myślę, że to zależy od użytkowników.Zaczynając od odpowiedzi Agatona , jest to funkcja, która faktycznie zwraca poszukiwany element (lub
null
jeśli nie został znaleziony), biorąc pod uwagęarray
orazcallback
funkcję, która zwraca prawdziwą wartość dla „poprawnego” elementu:Pamiętaj tylko, że to nie działa natywnie na IE8-, ponieważ nie obsługuje
some
. Można podać polifill, alternatywnie zawsze jest klasycznafor
pętla:Jest właściwie szybszy i bardziej kompaktowy. Ale jeśli nie chcesz wymyślać koła od nowa, sugeruję użycie biblioteki narzędziowej, takiej jak podkreślenie lub lodash.
źródło
Najkrótszy
źródło
Rozważ „axesOptions” jako tablicę obiektów o formacie obiektu {: field_type => 2,: fields => [1,3,4]}
źródło