Jaka jest najlepsza metoda uzyskania indeksu tablicy zawierającej obiekty?
Wyobraź sobie ten scenariusz:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
Chciałbym teraz, aby indexOf
obiekt miał hello
właściwość, 'stevie'
która w tym przykładzie byłaby 1
.
Jestem całkiem nowym użytkownikiem JavaScript i nie wiem, czy istnieje prosta metoda, czy też powinienem zbudować własną funkcję, aby to zrobić.
javascript
Antonio Laguna
źródło
źródło
hello
iqaz
?var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos];
[link] ( stackoverflow.com/a/16100446/1937255 )Odpowiedzi:
Myślę, że możesz rozwiązać go w jednym wierszu za pomocą funkcji mapy :
źródło
Array.prototype.map()
Array.prototype.findIndex jest obsługiwany we wszystkich przeglądarkach innych niż IE (non-edge). Ale podany polifill jest fajny.
Rozwiązanie z mapą jest w porządku. Ale iterujesz po całej tablicy przy każdym wyszukiwaniu. To tylko najgorszy przypadek dla findIndex, który przestaje iterować po znalezieniu dopasowania.
Nie ma tak naprawdę zwięzłego sposobu(gdy deweloperzy musieli martwić się o IE8) , ale oto wspólne rozwiązanie:lub jako funkcja:
Tylko kilka notatek:
Na przykład,
źródło
W ES2015 jest to dość łatwe:
lub prawdopodobnie z lepszą wydajnością dla większych tablic:
źródło
źródło
Podoba mi się odpowiedź Pablo, ale Array # indexOf i Array # map nie działają we wszystkich przeglądarkach. Podkreślenie użyje kodu natywnego, jeśli jest dostępny, ale ma również awarie. Dodatkowo ma metodę wyrywkową do robienia dokładnie tego, co robi anonimowa metoda mapy Pablo.
źródło
chain
jest tutaj zbędny._.pluck(myArray, 'hello').indexOf('stevie')
Lub prototypuj:
źródło
Array.prototype.indexOfObject = function(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; };
if (typeof property === 'string' || typeof property === 'number' || typeof property === 'boolean') return oldIndexOf(property, value);
. Jest tak, ponieważ jest to kilka rodzajów, które są niezmienne. Chciałbym również podać trzeci argument, aby w razie potrzeby umożliwić powrót do metody natywnej.Krótki
Przypadków użycia :
API:
źródło
Zrobiłem tutaj testy wydajności różnych odpowiedzi, które każdy może samodzielnie uruchomić:
https://jsperf.com/find-index-of-object-in-array-by-contents
Na podstawie moich pierwszych testów w Chrome następująca metoda (użycie pętli for skonfigurowanej w prototypie) jest najszybsza:
Ten kod jest nieco zmodyfikowaną wersją odpowiedzi Nathana Zaetty.
W testach wydajności wypróbowałem go zarówno z celem znajdującym się pośrodku (indeks 500), jak i na samym końcu (indeks 999) tablicy obiektów 1000, a nawet jeśli wstawię cel jako ostatni element tablicy (co oznacza że musi przechodzić przez każdy element w tablicy, zanim zostanie znaleziony), wciąż kończy się najszybciej.
Zaletą tego rozwiązania jest to, że jest jednym z najbardziej zwięzłych do wielokrotnego wykonywania, ponieważ należy powtórzyć tylko ostatnią linię:
źródło
while
pętli zamiastfor
jednej iperformance.now()
. Chciałbym, aby ta odpowiedź była jeszcze bardziej doceniona i że widziałem ją wcześniej, zaoszczędziłoby mi to trochę czasu ...Porównałem kilka metod i uzyskałem wynik w najszybszy sposób na rozwiązanie tego problemu. To jest
for
pętla. Jest ponad 5 razy szybszy niż jakakolwiek inna metoda.Oto strona testu: https://jsbench.me/9hjewv6a98
źródło
for-of
pętli nie?Chociaż większość innych odpowiedzi tutaj jest poprawnych. Czasami najlepiej jest po prostu zrobić krótką, prostą funkcję w pobliżu miejsca, gdzie będziesz jej używać.
To zależy od tego, co jest dla Ciebie ważne. Może oszczędzać wiersze kodu i bardzo sprytnie jest korzystać z jednowierszowego lub umieszczać ogólne rozwiązanie gdzieś, które obejmuje różne przypadki brzegowe. Ale czasem lepiej jest po prostu powiedzieć: „tutaj zrobiłem to w ten sposób”, niż pozostawić przyszłym programistom dodatkowe prace inżynierii odwrotnej. Zwłaszcza jeśli uważasz się za „nowicjusza” jak w swoim pytaniu.
źródło
Uważaj na
[0]
.Należy używać
reduce
jak wAntonio Laguna
odpowiedzi.Przepraszamy za zwięzłość ...
źródło
Jeśli twój obiekt jest tym samym obiektem, którego używasz w tablicy, powinieneś być w stanie uzyskać indeks obiektu w taki sam sposób, jak robisz to tak, jakby to był ciąg znaków.
źródło
Spróbuj tego:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
źródło
prosty:
źródło
Jeśli jesteś zainteresowany tylko znalezieniem stanowiska, zobacz odpowiedź @ Pablo .
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
Jednakże, jeśli nie możesz się doczekać znalezienia elementu (tj. Jeśli zastanawiasz się nad zrobieniem czegoś takiego
myArray[pos]
), istnieje bardziej efektywny, jednowierszowy sposób, używając tegofilter
.element = myArray.filter((e) => e.hello === 'stevie')[0];
Zobacz wyniki wydajności (~ + 42% operacji / s): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3
źródło
Zobacz ten przykład: http://jsfiddle.net/89C54/
Zaczyna się od zera.
źródło
Zrobiłem ogólną funkcję, aby sprawdzić, czy poniżej jest kod i działa dla każdego obiektu
Pierwszy alert zwróci -1 (oznacza, że nie znaleziono dopasowania), a drugi alert zwróci 0 (oznacza, że znaleziono dopasowanie).
źródło
Użyj
_.findIndex
z biblioteki underscore.jsOto przykład
_.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1
źródło
Używając
findIndex
metody ES6 , bez lodash ani żadnych innych bibliotek, możesz napisać:Spowoduje to porównanie bezpośrednich właściwości obiektu, ale nie powtórzy się we właściwościach.
Jeśli twoja implementacja
findIndex
jeszcze nie zapewnia (większość tego nie robi), możesz dodać lekki wypełniacz, który obsługuje to wyszukiwanie:(z mojej odpowiedzi na ten duplikat )
źródło
Array.prototype.findIndex()
Zasadniczo możesz korzystać z natywnej i wygodnej funkcji :Uwaga: nie jest obsługiwana w przeglądarkach Internet Explorer, Opera i Safari, ale możesz skorzystać z funkcji Polyfill podanej w poniższym linku.
Więcej informacji:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex
źródło
Oprócz odpowiedzi @Monika Garg możesz użyć
findIndex()
(Istnieje wiele wypełniaczy dla niepoprawnych przeglądarek).Widziałem, że ludzie głosowali za tą odpowiedzią i mam nadzieję, że zrobili to z powodu złej składni, ponieważ moim zdaniem jest to najbardziej elegancki sposób.
Na przykład:
źródło
W ten sposób można znaleźć indeks obiektu w tablicy
źródło
Działa to bez niestandardowego kodu
źródło
Możesz po prostu użyć
Bez podkreślenia, nie dla, po prostu redukcja.
źródło
źródło
Aby to zrobić, możesz stworzyć własny prototyp:
coś jak:
źródło
Wolę użyć
findIndex()
metody:index
poda ci numer indeksu.źródło