Ich habe ein Array wie dieses:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
Wie kann ich den Index des Objekts abrufen, der einer Bedingung entspricht, ohne das gesamte Array zu durchlaufen?
Zum Beispiel prop2=="yutu"
möchte ich einen Index erhalten 1
.
Ich habe gesehen, .indexOf()
aber ich denke, es wird für einfache Arrays wie verwendet ["a1","a2",...]
. Ich habe auch überprüft, $.grep()
aber dies gibt Objekte zurück, nicht den Index.
quelle
0
?). Beide Lösungen mehr tun Iteration als erforderlich, was weniger ist als ideal , wenn das Array groß ist (obwohl die Chancen , es so groß ein Mensch würde bemerken niedrig sind, es sei denn , Lookups eine geschehen viel ).x => x.prop2=="yutu"
mit findIndex () funktioniert?function(x) { return x.prop2=="yutu" }
index = a.findIndex(function (x) { return x.prop2 == "yutu" })
das Problem behoben , so dass mit dem polyfill Code, Find in IE11 arbeiteteSie können nicht, etwas muss das Array durchlaufen (mindestens einmal).
Wenn sich die Bedingung stark ändert, müssen Sie die darin enthaltenen Objekte durchlaufen und überprüfen, ob sie mit der Bedingung übereinstimmen. Auf einem System mit ES5-Funktionen (oder wenn Sie einen Shim installieren) kann diese Iteration jedoch ziemlich präzise durchgeführt werden:
Dabei wird die neue (ish)
Array#some
Funktion verwendet , die die Einträge im Array durchläuft, bis die von Ihnen angegebene Funktion true zurückgibt. Die Funktion, die ich ihm gegeben habe, speichert den Index des übereinstimmenden Eintrags und kehrt dann zurücktrue
, um die Iteration zu stoppen.Oder verwenden Sie einfach eine
for
Schleife. Ihre verschiedenen Iterationsoptionen werden in dieser anderen Antwort behandelt .Wenn Sie jedoch immer dieselbe Eigenschaft für diese Suche verwenden und die Eigenschaftswerte eindeutig sind, können Sie nur eine Schleife ausführen und ein Objekt erstellen, um sie zuzuordnen:
(Oder Sie können eine
for
Schleife oder eine Ihrer anderen Optionen verwenden .)Wenn Sie dann den Eintrag mit
prop2 = "yutu"
finden müssen, können Sie dies tun:Ich nenne das "Cross-Indexing" das Array. Wenn Sie Einträge entfernen oder hinzufügen (oder deren
prop2
Werte ändern ), müssen Sie natürlich auch Ihr Zuordnungsobjekt aktualisieren.quelle
thg435
was ich wollte ...Was TJ Crowder gesagt hat, wird immer eine Art versteckte Iteration haben, mit lodash wird dies:
quelle
Und für grundlegende Array-Nummern können Sie auch Folgendes tun:
Sie erhalten -1, wenn im Array kein Wert gefunden werden kann.
quelle
Durchlaufen Sie alle Elemente des Arrays. Es gibt entweder den Index und true oder false zurück, wenn die Bedingung nicht übereinstimmt.
Wichtig ist der explizite Rückgabewert von true (oder ein Wert, dessen boolesches Ergebnis true ist). Die einzelne Zuweisung ist aufgrund eines möglichen Index mit 0 (Boolean (0) === false) nicht ausreichend, was keinen Fehler zur Folge hätte, aber die Unterbrechung der Iteration deaktiviert.
Bearbeiten
Eine noch kürzere Version der oben genannten:
quelle
|
Operator, es ist eine Kurzversion, um aus einem Index (mit -1) ein wahrheitsgemäßes / falsches Ergebnis zu erhalten, wenn ein Index vorhanden ist.~
funktioniert es nicht so.!!(index = 0)
und!!~(index = 0)
Unterschied in der Tat. Vielen Dank!Sie können Array.prototype.some () folgendermaßen verwenden (wie in den anderen Antworten erwähnt):
https://jsfiddle.net/h1d69exj/2/
quelle
Ich habe oben viele Lösungen gesehen.
Hier verwende ich die Kartenfunktion, um den Index des Suchtextes in einem Array-Objekt zu finden.
Ich werde meine Antwort anhand der Schülerdaten erklären.
Schritt 1 : Erstellen Sie ein Array-Objekt für die Schüler (optional können Sie Ihr eigenes Array-Objekt erstellen).
var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];
Schritt 2 : Erstellen Sie eine Variable zum Suchen von Text
var studentNameToSearch = "Divya";
Schritt 3 : Erstellen Sie eine Variable zum Speichern des übereinstimmenden Index (hier verwenden wir die Kartenfunktion zum Iterieren).
var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);
quelle
quelle
Warum möchten Sie nicht genau iterieren? Die neuen Array.prototype.forEach eignen sich hervorragend für diesen Zweck!
Sie können einen binären Suchbaum verwenden, um über einen einzelnen Methodenaufruf zu suchen, wenn Sie möchten. Dies ist eine nette Implementierung von BTree und Red Black Search Tree in JS - https://github.com/vadimg/js_bintrees - aber ich bin nicht sicher, ob Sie den Index gleichzeitig finden können.
quelle
Ein Schritt mit Array.reduce () - keine jQuery
wird zurückgegeben,
null
wenn der Index nicht gefunden wurde.quelle
quelle
Georg hat bereits erwähnt, dass ES6 Array.findIndex dafür hat. Einige andere Antworten können mit der Array.some-Methode für ES5 umgangen werden.
Ein eleganterer Ansatz kann sein
Gleichzeitig möchte ich betonen, dass Array.some mit binären oder anderen effizienten Suchtechniken implementiert werden kann. In einigen Browsern ist die for-Schleife möglicherweise besser.
quelle
Versuchen Sie diesen Code
quelle