Mam taką tablicę:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
Jak mogę uzyskać indeks obiektu, który pasuje do warunku, bez iteracji po całej tablicy?
Na przykład, biorąc pod uwagę prop2=="yutu"
, chcę uzyskać indeks 1
.
Widziałem, .indexOf()
ale myślę, że jest używany do prostych tablic takich jak ["a1","a2",...]
. Sprawdziłem również, $.grep()
ale zwraca obiekty, a nie indeks.
źródło
0
?). Oba rozwiązania wykonują więcej iteracji niż jest to wymagane, co jest mniej niż idealne, jeśli tablica jest duża (chociaż szanse na to, że będzie tak duża, że człowiek zauważy, są niskie, chyba że dużo się dzieje ).x => x.prop2=="yutu"
działa funkcja findIndex ()?function(x) { return x.prop2=="yutu" }
index = a.findIndex(function (x) { return x.prop2 == "yutu" })
stały problem tak, że wraz z kodem polyfill, findIndex pracował w IE11Nie możesz, coś musi iterować przez tablicę (przynajmniej raz).
Jeśli warunek bardzo się zmienia, musisz przejść przez pętlę i spojrzeć na znajdujące się w nim obiekty, aby sprawdzić, czy pasują do tego warunku. Jednak w systemie z funkcjami ES5 (lub jeśli zainstalujesz podkładkę), iterację można wykonać dość zwięźle:
Który używa nowego (ish)
Array#some
funkcję , która przechodzi poprzez wpisy w tablicy aż do funkcji dajesz to zwraca true. Podana funkcja zapisuje indeks pasującego wpisu, a następnie wraca,true
aby zatrzymać iterację.Lub oczywiście po prostu użyj
for
pętli. Różne opcje iteracji zostały omówione w tej drugiej odpowiedzi .Ale jeśli zawsze będziesz używać tej samej właściwości do tego wyszukiwania, a jeśli wartości właściwości są unikalne, możesz zapętlić tylko raz i utworzyć obiekt, aby je odwzorować:
(Lub ponownie możesz użyć
for
pętli lub dowolnej innej opcji ).Jeśli chcesz znaleźć wpis
prop2 = "yutu"
, możesz to zrobić:Nazywam to „indeksowaniem krzyżowym” tablicą. Oczywiście, jeśli usuniesz lub dodasz wpisy (lub zmienisz ich
prop2
wartości), musisz również zaktualizować obiekt mapowania.źródło
thg435
zrobiło to, co chciałem ...To, co powiedział TJ Crowder, za każdym razem będzie miało jakąś ukrytą iterację, z laszaszem staje się to:
źródło
W przypadku podstawowych numerów tablic możesz to również zrobić:
Otrzymasz -1, jeśli nie może znaleźć wartości w tablicy.
źródło
Iteruj po wszystkich elementach tablicy. Zwraca indeks i true lub false, jeśli warunek nie jest zgodny.
Ważna jest jawna wartość zwracana true (lub wartość, której wynik boolowski jest prawdziwy). Pojedyncze przypisanie nie jest wystarczające z powodu możliwego indeksu z 0 (Boolean (0) === false), co nie spowodowałoby błędu, ale wyłącza przerwanie iteracji.
Edytować
Jeszcze krótsza wersja powyższego:
źródło
|
operator NIE , to krótka wersja uzyskiwania z indeksu (z -1) wyniku prawda / fałsz , jeśli indeks istnieje.~
niego tak nie działa.!!(index = 0)
i!!~(index = 0)
rzeczywiście różnica. Dzięki!Możesz użyć Array.prototype.some () w następujący sposób (jak wspomniano w innych odpowiedziach):
https://jsfiddle.net/h1d69exj/2/
źródło
Widziałem wiele rozwiązań powyżej.
Korzystam z funkcji mapowania, aby znaleźć indeks wyszukiwanego tekstu w obiekcie tablicowym.
Wyjaśnię moją odpowiedź za pomocą danych uczniów.
krok 1 : utwórz obiekt tablicowy dla uczniów (opcjonalnie możesz stworzyć własny obiekt tablicowy).
var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];
krok 2 : Utwórz zmienną, aby wyszukać tekst
var studentNameToSearch = "Divya";
krok 3 : Utwórz zmienną do przechowywania dopasowanego indeksu (tutaj używamy funkcji mapy do iteracji).
var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);
źródło
źródło
Dlaczego nie chcesz dokładnie iterować? Nowy Array.prototype.forEach doskonale nadaje się do tego celu!
Możesz użyć drzewa wyszukiwania binarnego, aby znaleźć jedno wywołanie metody, jeśli chcesz. To fajna implementacja drzewa BTree i Red Black Search w JS - https://github.com/vadimg/js_bintrees - ale nie jestem pewien, czy można znaleźć indeks w tym samym czasie.
źródło
Jeden krok za pomocą Array.reduce () - bez jQuery
zwróci,
null
jeśli indeks nie zostanie znaleziony.źródło
źródło
Georg wspomniał już, że ES6 ma Array.findIndex do tego. I niektóre inne odpowiedzi są obejścia dla ES5 przy użyciu metody Array.some.
Może być jeszcze jedno eleganckie podejście
Jednocześnie chciałbym podkreślić, że Array.some może być implementowany za pomocą binarnej lub innej wydajnej techniki wyszukiwania. Może więc działać lepiej w pętli for w niektórych przeglądarkach.
źródło
Wypróbuj ten kod
źródło