Was ist die beste Methode, um den Index eines Arrays zu erhalten, das Objekte enthält?
Stellen Sie sich dieses Szenario vor:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
Jetzt möchte ich das indexOf
Objekt haben, welche hello
Eigenschaft 'stevie'
welche ist, in diesem Beispiel 1
.
Ich bin ein ziemlich Neuling in JavaScript und ich weiß nicht, ob es eine einfache Methode gibt oder ob ich meine eigene Funktion dafür erstellen sollte.
javascript
Antonio Laguna
quelle
quelle
hello
undqaz
?var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos];
[link] ( stackoverflow.com/a/16100446/1937255 )Antworten:
Ich denke, Sie können es in einer Zeile mit der Kartenfunktion lösen :
quelle
Array.prototype.map()
Array.prototype.findIndex wird in allen Browsern außer IE (ohne Edge) unterstützt. Aber die bereitgestellte Polyfüllung ist schön.
Die Lösung mit Karte ist okay. Sie iterieren jedoch bei jeder Suche über das gesamte Array. Dies ist nur der schlechteste Fall für findIndex, der die Iteration beendet, sobald eine Übereinstimmung gefunden wurde.
Es gibt keinen wirklich prägnanten Weg(als Entwickler sich um IE8 sorgen mussten) , aber hier ist eine gängige Lösung:oder als Funktion:
Nur ein paar Anmerkungen:
Zum Beispiel,
quelle
In ES2015 ist dies ziemlich einfach:
oder wahrscheinlich mit besserer Leistung für größere Arrays:
quelle
quelle
Ich mag Pablos Antwort, aber Array # indexOf und Array # map funktionieren nicht in allen Browsern. Unterstrich verwendet nativen Code, sofern dieser verfügbar ist, weist jedoch auch Fallbacks auf. Außerdem verfügt es über die Zupfmethode, mit der genau das ausgeführt wird, was die anonyme Kartenmethode von Pablo bewirkt.
quelle
chain
ist hier überflüssig._.pluck(myArray, 'hello').indexOf('stevie')
Oder Prototyp:
quelle
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);
. Dies liegt daran, dass dies die wenigen Typen sind, die unveränderlich sind. Ich würde auch ein drittes Argument nennen, um bei Bedarf einen Fallback auf die native Methode zu ermöglichen.Kurz
Anwendungsfälle :
API:
quelle
Ich habe hier einige Leistungstests mit verschiedenen Antworten durchgeführt, die jeder selbst ausführen kann:
https://jsperf.com/find-index-of-object-in-array-by-contents
Basierend auf meinen ersten Tests in Chrome ist die folgende Methode (unter Verwendung einer in einem Prototyp eingerichteten for-Schleife) die schnellste:
Dieser Code ist eine leicht modifizierte Version von Nathan Zaettas Antwort.
In den Leistungsbenchmarks habe ich es versucht, wobei sich das Ziel sowohl in der Mitte (Index 500) als auch am Ende (Index 999) eines 1000-Objekt-Arrays befand, und selbst wenn ich das Ziel als allerletztes Element in das Array eingefügt habe (dh) dass es jedes einzelne Element im Array durchlaufen muss, bevor es gefunden wird), endet es immer noch am schnellsten.
Diese Lösung hat auch den Vorteil, dass sie eine der knappsten für die wiederholte Ausführung ist, da nur die letzte Zeile wiederholt werden muss:
quelle
while
Schleife anstellefor
einer verwendet, undperformance.now()
. Ich wünschte, diese Antwort wäre mehr positiv bewertet worden und ich hätte sie früher gesehen, es hätte mir einige Zeit gespart ...Ich habe mehrere Methoden verglichen und ein Ergebnis mit dem schnellsten Weg zur Lösung dieses Problems erhalten. Es ist ein
for
Schleife. Es ist mehr als fünfmal schneller als jede andere Methode.Hier ist die Testseite: https://jsbench.me/9hjewv6a98
quelle
for-of
Schleife nein?Die meisten anderen Antworten hier sind gültig. Manchmal ist es am besten, eine kurze einfache Funktion in der Nähe des Verwendungsortes zu erstellen.
Es kommt darauf an, was Ihnen wichtig ist. Es kann Codezeilen speichern und sehr klug sein, einen Einzeiler zu verwenden oder eine generische Lösung zu platzieren, die verschiedene Randfälle abdeckt. Aber manchmal ist es besser, einfach zu sagen: "Hier habe ich es so gemacht", als zukünftige Entwickler zusätzlichen Reverse Engineering-Arbeiten zu überlassen. Vor allem, wenn Sie sich wie in Ihrer Frage als "Neuling" betrachten.
quelle
Kümmere dich um das
[0]
.Es ist richtig zu verwenden
reduce
wie inAntonio Laguna
der Antwort zu verwenden.Entschuldigung für die Kürze ...
quelle
Wenn Ihr Objekt dasselbe Objekt ist wie das, das Sie innerhalb des Arrays verwenden, sollten Sie in der Lage sein, den Index des Objekts auf dieselbe Weise abzurufen, als wäre es eine Zeichenfolge.
quelle
Versuche dies:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
quelle
einfach:
quelle
Wenn Sie nur daran interessiert sind, die Position zu finden, lesen Sie die Antwort von @ Pablo .
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
Wenn Sie sich jedoch darauf freuen , das Element zu finden (dh wenn Sie daran gedacht haben, so etwas zu tun
myArray[pos]
), gibt es eine effizientere einzeilige Möglichkeit, dies zu tunfilter
.element = myArray.filter((e) => e.hello === 'stevie')[0];
Siehe Leistungsergebnisse (~ + 42% ops / s): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3
quelle
Siehe dieses Beispiel: http://jsfiddle.net/89C54/
Es beginnt mit Null zu zählen.
quelle
Ich habe eine generische Funktion erstellt, um zu überprüfen, ob der folgende Code für jedes Objekt funktioniert
Die erste Warnung gibt -1 zurück (bedeutet Übereinstimmung nicht gefunden) und die zweite Warnung gibt 0 zurück (bedeutet Übereinstimmung gefunden).
quelle
Verwendung
_.findIndex
aus der Bibliothek underscore.jsHier ist das Beispiel
_.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1
quelle
Mit der ES6-
findIndex
Methode können Sie ohne lodash oder andere Bibliotheken schreiben:Dadurch werden die unmittelbaren Eigenschaften des Objekts verglichen, jedoch nicht in die Eigenschaften zurückgeführt.
Wenn Ihre Implementierung noch keine bereitstellt
findIndex
(die meisten nicht), können Sie eine leichte Polyfüllung hinzufügen, die diese Suche unterstützt:(Aus meiner Antwort auf diesen Betrug )
quelle
Sie können
Array.prototype.findIndex()
grundsätzlich eine native und bequeme Funktion verwenden :Nur ein Hinweis, es wird in Internet Explorer, Opera und Safari nicht unterstützt, aber Sie können eine Polyfüllung verwenden, die unter dem folgenden Link bereitgestellt wird.
Mehr Informationen:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex
quelle
Weitere Antwort von @Monika Garg können Sie verwenden
findIndex()
(Es gibt eine Polyfüllung für unsupprted Browser).Ich habe gesehen, dass die Leute diese Antwort abgelehnt haben, und ich hoffe, dass sie dies aufgrund der falschen Syntax getan haben, weil dies meiner Meinung nach der eleganteste Weg ist.
Zum Beispiel:
quelle
Auf diese Weise finden Sie den Index des Objekts im Array
quelle
Dies funktioniert ohne benutzerdefinierten Code
quelle
Sie können einfach verwenden
Kein Unterstrich, nein für, nur eine Reduzierung.
quelle
quelle
Sie können dazu Ihren eigenen Prototyp erstellen:
etwas wie:
quelle
Ich werde es vorziehen,
findIndex()
Methode zu verwenden :index
gibt Ihnen die Indexnummer.quelle