Trochę surfowałem po okolicy, próbując znaleźć skuteczny sposób, aby to zrobić, ale do niczego nie doszedłem. Mam tablicę obiektów, która wygląda następująco:
array[i].id = some number;
array[i].name = some name;
To, co chcę zrobić, to znaleźć INDEKSY obiektów, w których id jest równe, na przykład, jednemu z 0, 1, 2, 3 lub 4. Przypuszczam, że mógłbym zrobić coś takiego:
var indexes = [];
for(i=0; i<array.length; i++) {
(array[i].id === 0) ? { indexes[0] = i }
(array[i].id === 1) ? { indexes[1] = i }
(array[i].id === 2) ? { indexes[2] = i }
(array[i].id === 3) ? { indexes[3] = i }
(array[i].id === 4) ? { indexes[4] = i }
}
Chociaż to by zadziałało, wygląda na dość drogie i wolne (nie wspominając o brzydkim), zwłaszcza jeśli array.length może być duża. Jakieś pomysły, jak to trochę urozmaicić? Myślałem o użyciu w jakiś sposób array.indexOf, ale nie wiem, jak wymusić składnię. To
array.indexOf(this.id === 0);
na przykład zwraca undefined, tak jak prawdopodobnie powinno. Z góry dziękuję!
javascript
arrays
indexof
Petrov
źródło
źródło
Array.prototype.findIndex()
w ECMAScript 2015. Zaakceptowana odpowiedź była jednak niesamowita.Odpowiedzi:
Może chciałbyś użyć funkcji wyższego rzędu, takich jak „mapa”. Zakładając, że chcesz wyszukiwać według atrybutu „pole”:
źródło
function hashf(el) { return String(el.id) + "_" + String(el.name); }
. To tylko wskazówka:elementPos = array.map(hashf(x)).indexOf(hash({id:3, name:'Pablo'}));
oczywiście funkcja skrótu, którą zapewniam, nie jest poprawna we wszystkich przypadkach, ponieważ'_'
może stanowić część twoich wartości, ale jest to tylko szybki przykład, możesz znaleźć różne metody mieszania.indexOf
wartość zwracana, gdy nie może zlokalizować podanej wartości.map, indexOf
, możesz użyć tylko jednej o nazwiefindIndex
....... Np .:[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3}) OR [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
Najprostszy i najłatwiejszy sposób na znalezienie indeksu elementu w tablicy.
Składnia ES5:
[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})
Składnia ES6:
[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
źródło
findIndex
na stronie developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...obj.id == 3
operator użyty tutaj może spowodować nieoczekiwaną konwersję typu, więcobj.id === 3
zamiast tego użyj operatora, który sprawdza równą wartość i typ.var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
tego zajęło 0,03500000002532033 milisekund. Użycie[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
tego zajęło 0,00999999747378752 milisekund.Nowa metoda Array .filter () będzie dobrze działać w tym przypadku:
jQuery może to również zrobić za pomocą .grep ()
edycja: warto wspomnieć, że obie te funkcje po prostu powtarzają się pod maską, nie będzie zauważalnej różnicy w wydajności między nimi i włączaniem własnej funkcji filtra, ale po co wymyślać koło na nowo.
źródło
Jeśli zależy Ci na wydajności, nie idź z znalezisku lub filtr lub map lub którykolwiek z wyżej omówionych metod
Oto przykład demonstrujący najszybszą metodę. TUTAJ jest link do właściwego testu
Blok konfiguracji
Najszybsza metoda
Wolniejsze metody
NAJWOLNIEJSZA metoda
źródło
wynikiem jest lista wyszukiwania identyfikatora. z podanym id otrzymujemy indeks rekordu.
źródło
źródło
Ponieważ nie ma odpowiedzi przy użyciu zwykłej tablicy
find
:źródło
Nowy sposób korzystania z ES6
źródło
picked_element
to tablica w tym przypadku ...const index = array.findIndex(item => item.id === 'your-id');
To powinno dać ci indeks pozycji w tablicy z id === twój-id
źródło
Wydaje mi się, że możesz stworzyć prosty iterator z wywołaniem zwrotnym do testowania. Tak jak to:
Następnie możesz wywołać w ten sposób:
źródło
Dostosowując odpowiedź Tejsa do mongoDB i Robomongo zmieniłem
do
źródło
Korzystanie z
map
funkcji ES6 :źródło
Podsumowując całą świetną odpowiedź powyżej i dodatkową moją odpowiedź dotyczącą znaleźć wszystkie indeksy pojawiły się z niektórych komentarzy.
źródło
Ponieważ nie mogę jeszcze komentować, chcę pokazać rozwiązanie, które zastosowałem w oparciu o metodę opublikowaną przez Umair Ahmed, ale gdy chcesz wyszukać klucz zamiast wartości:
Rozumiem, że nie odpowiada na rozszerzone pytanie, ale tytuł nie określa, czego oczekiwano od każdego obiektu, więc chcę pokornie się tym podzielić, aby w przyszłości oszczędzić innym bólom głowy, podczas gdy ja nie rozumiem, że może to nie być najszybsze rozwiązanie.
źródło
Stworzyłem małe narzędzie o nazwie super-array, w którym można uzyskać dostęp do elementów w tablicy za pomocą unikalnego identyfikatora o złożoności O (1). Przykład:
źródło
zwróci indeks 1 (działa tylko w ES 2016)
źródło
Podoba mi się ta metoda, ponieważ łatwo jest porównać ją z dowolną wartością w obiekcie, niezależnie od tego, jak głęboko jest on zagnieżdżony.
źródło