Ich habe ein wenig herumgesurft, um einen effizienten Weg zu finden, bin aber nirgendwo hingekommen. Ich habe eine Reihe von Objekten, die so aussehen:
array[i].id = some number;
array[i].name = some name;
Was ich tun möchte, ist, die INDEXE der Objekte zu finden, bei denen id beispielsweise einem von 0,1,2,3 oder 4 entspricht. Ich nehme an, ich könnte einfach so etwas tun:
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 }
}
Dies würde zwar funktionieren, scheint aber ziemlich teuer und langsam zu sein (ganz zu schweigen von hässlich), insbesondere wenn array.length groß sein könnte. Irgendwelche Ideen, wie man das ein bisschen aufpeppen kann? Ich dachte daran, array.indexOf irgendwie zu verwenden, aber ich sehe nicht, wie ich die Syntax erzwingen soll. Dies
array.indexOf(this.id === 0);
Gibt beispielsweise undefiniert zurück, wie es wahrscheinlich sollte. Danke im Voraus!
javascript
arrays
indexof
Petrov
quelle
quelle
Array.prototype.findIndex()
in ECMAScript 2015. Die akzeptierte Antwort war großartig.Antworten:
Vielleicht möchten Sie Funktionen höherer Ordnung wie "Karte" verwenden. Angenommen, Sie möchten nach dem Attribut "Feld" suchen:
quelle
function hashf(el) { return String(el.id) + "_" + String(el.name); }
. Dies ist nur ein Hinweis:elementPos = array.map(hashf(x)).indexOf(hash({id:3, name:'Pablo'}));
Natürlich ist die von mir bereitgestellte Hash-Funktion nicht für alle Fälle gültig, da'_'
sie Teil Ihrer Werte sein könnte, aber es ist nur ein kurzes Beispiel, wie Sie verschiedene Hash-Methoden herausfinden können.indexOf
Rückgabewert ist, wenn ein bestimmter Wert nicht gefunden werden kann.map, indexOf
, können Sie nur eine verwenden, diefindIndex
....... heißt. Beispiel :[{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)
Der einfachste und einfachste Weg, um einen Elementindex im Array zu finden.
ES5-Syntax:
[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})
ES6-Syntax:
[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
quelle
findIndex
unter developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…obj.id == 3
hier verwendete Operator eine unerwartete Typkonvertierung verursachen kann. Verwenden Sieobj.id === 3
stattdessen den Operator, der auf gleichen Wert und Typ prüft.var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
dauerte 0,03500000002532033 Millisekunden. Die Verwendung[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
dauerte 0,00999999747378752 Millisekunden.Die neue Array-Methode .filter () würde dafür gut funktionieren:
jQuery kann dies auch mit .grep () tun
Bearbeiten: Es ist erwähnenswert, dass diese beiden Funktionen nur unter der Haube durchlaufen werden. Es gibt keinen merklichen Leistungsunterschied zwischen ihnen und dem Rollen Ihrer eigenen Filterfunktion, aber warum sollten Sie das Rad neu erfinden?
quelle
Wenn Sie über die Leistung kümmern, tun sie nicht mit gehen finden oder Filter oder Karte oder einen der oben diskutierten Verfahren
Hier ist ein Beispiel, das die schnellste Methode demonstriert. HIER ist der Link zum eigentlichen Test
Setup-Block
Schnellste Methode
Langsamere Methoden
LANGSAMSTE Methode
quelle
Das Ergebnis ist eine Nachschlageliste für die ID. Mit der angegebenen ID erhalten wir den Index des Datensatzes.
quelle
quelle
Da es keine Antwort mit normalem Array gibt
find
:quelle
Ein neuer Weg mit ES6
quelle
picked_element
ist ein Array in diesem Fall ...const index = array.findIndex(item => item.id === 'your-id');
Dadurch sollten Sie den Index des Elements im Array mit der ID === your-id erhalten
quelle
Klingt für mich so, als könnten Sie einen einfachen Iterator mit einem Rückruf zum Testen erstellen. Wie so:
Dann könnten Sie so aufrufen:
quelle
Ich habe Tejs 'Antwort für mongoDB und Robomongo angepasst und mich geändert
zu
quelle
Verwenden der ES6-
map
Funktion:quelle
Um alle oben genannten großartigen Antworten und zusätzlich meine Antwort bezüglich der Suche nach allen Indizes zusammenzufassen, die aus einigen Kommentaren hervorgegangen sind.
quelle
Da ich noch keinen Kommentar abgeben kann, möchte ich die Lösung zeigen, die ich basierend auf der von Umair Ahmed veröffentlichten Methode verwendet habe. Wenn Sie jedoch nach einem Schlüssel anstelle eines Werts suchen möchten:
Ich verstehe, dass es die erweiterte Frage nicht beantwortet, aber der Titel gibt nicht an, was von jedem Objekt gewünscht wurde. Deshalb möchte ich dies demütig teilen, um anderen in Zukunft Kopfschmerzen zu ersparen, während ich es nicht starten kann schnellste Lösung.
quelle
Ich habe ein kleines Dienstprogramm namens Super-Array erstellt, mit dem Sie über eine eindeutige Kennung mit O (1) -Komplexität auf Elemente in einem Array zugreifen können. Beispiel:
quelle
gibt Index 1 zurück (funktioniert nur in ES 2016)
quelle
Ich mag diese Methode, weil es einfach ist, sie mit jedem Wert im Objekt zu vergleichen, egal wie tief es verschachtelt ist.
quelle