Verwenden Sie die find()
Methode:
myArray.find(x => x.id === '45').foo;
Von MDN :
Die find()
Methode gibt den ersten Wert im Array zurück, wenn ein Element im Array die bereitgestellte Testfunktion erfüllt. Andernfalls undefined
wird zurückgegeben.
Wenn Sie stattdessen den Index suchen möchten , verwenden Sie findIndex()
:
myArray.findIndex(x => x.id === '45');
Von MDN :
Die findIndex()
Methode gibt den Index des ersten Elements im Array zurück, das die bereitgestellte Testfunktion erfüllt. Andernfalls wird -1 zurückgegeben.
Wenn Sie ein Array übereinstimmender Elemente erhalten möchten, verwenden Sie filter()
stattdessen die folgende Methode:
myArray.filter(x => x.id === '45');
Dies gibt ein Array von Objekten zurück. Wenn Sie ein Array von foo
Eigenschaften erhalten möchten , können Sie dies mit der folgenden map()
Methode tun :
myArray.filter(x => x.id === '45').map(x => x.foo);
Randnotiz: Methoden wie find()
oder filter()
und Pfeilfunktionen werden von älteren Browsern (wie IE) nicht unterstützt. Wenn Sie diese Browser unterstützen möchten, sollten Sie Ihren Code mit Babel (mit der Polyfüllung ) transpilieren .
Michał Perłakowski
quelle
Da Sie jQuery bereits verwenden, können Sie die grep- Funktion verwenden, die zum Durchsuchen eines Arrays vorgesehen ist:
Das Ergebnis ist ein Array mit den gefundenen Elementen. Wenn Sie wissen, dass das Objekt immer vorhanden ist und nur einmal vorkommt, können Sie es einfach verwenden
result[0].foo
, um den Wert abzurufen. Andernfalls sollten Sie die Länge des resultierenden Arrays überprüfen. Beispiel:quelle
===
statt zu verwenden==
, um seltsame Probleme mit dem JavaScript-==
Operator zu vermeiden .e.id
undid
werden Strings sein, ich , es ist in Ordnung, Gebrauch annehmen==
. Aber wenn Sie sich nicht sicher sind, könnten Probleme auftreten (da'' == 0
ist,true
aber'' === 0
istfalse
). Ganz zu schweigen davon===
, dass es schneller zu sein scheint ( stackoverflow.com/questions/359494/… ).===
weil es genau wie==
in anderen Programmiersprachen funktioniert . Ich halte==
es für nicht existent in JavaScript.Eine andere Lösung besteht darin, ein Suchobjekt zu erstellen:
Dies ist besonders interessant, wenn Sie viele Suchvorgänge durchführen müssen.
Dies benötigt nicht viel mehr Speicher, da die IDs und Objekte gemeinsam genutzt werden.
quelle
lookup
Objekts Zeitverschwendung.ECMAScript 2015 bietet die find () -Methode für Arrays:
Es funktioniert ohne externe Bibliotheken. Wenn Sie jedoch Unterstützung für ältere Browser wünschen, können Sie diese Polyfüllung einschließen .
quelle
myArray.find(d=>d.id===45).foo;
.myArray.find(({ id }) => id === 45).foo
. Dies ist jedoch eine alte Antwort, die geschrieben wurde, bevor die ES2015-Syntax genauso gut unterstützt wurde wie jetzt. @ Gothdos Antwort ist derzeit die aktuellste im Thread.myArray.find(d => d.id === 45)?.foo
.Underscore.js hat dafür eine gute Methode:
quelle
Ich denke, der einfachste Weg wäre der folgende, aber er funktioniert nicht mit Internet Explorer 8 (oder früher):
quelle
for
?for
Schleife nicht sehr schnell ist .for
Schleife beim ersten Abgleich endet.id
Versuche Folgendes
quelle
quelle
Eine generische und flexiblere Version der obigen Funktion findById:
quelle
Sie können dies einfach mit der Funktion map () erreichen :
Arbeitsbeispiel: http://jsfiddle.net/hunter/Pxaua/
quelle
map
automatisch entferntnull
. Es klingt für mich und das gemeinsame Konzept von irreführendmap
, da das Ergebnis nicht die gleiche Länge wie die ursprüngliche Sammlung hat.Sie können Filter verwenden,
quelle
Obwohl es hier viele richtige Antworten gibt, sprechen viele von ihnen nicht die Tatsache an, dass dies eine unnötig teure Operation ist, wenn sie mehrmals ausgeführt wird. Im Extremfall kann dies die Ursache für echte Leistungsprobleme sein.
Wenn Sie in der realen Welt viele Elemente verarbeiten und die Leistung ein Problem darstellt, ist es viel schneller, zunächst eine Suche zu erstellen:
Sie können dann zu Gegenständen in fester Zeit wie folgt gelangen:
Sie können auch eine Map anstelle eines Objekts als Lookup verwenden: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
quelle
Native verwenden
Array.reduce
Gibt das Objektelement zurück, wenn es gefunden wird
false
quelle
Wenn Sie dies mehrmals tun, können Sie eine Karte (ES6) einrichten:
Dann können Sie einfach tun:
quelle
Hier ist, wie ich es in reinem JavaScript machen würde, so minimal ich mir vorstellen kann, dass dies in ECMAScript 3 oder höher funktioniert. Es wird zurückgegeben, sobald eine Übereinstimmung gefunden wurde.
quelle
Allgemeiner und kurzer
in Ihrem Fall Ex.
var element = findFromArray(myArray,'id',45)
das wird dir das ganze Element geben.quelle
Sie können Sugarjs unter http://sugarjs.com/ ausprobieren .
Es hat eine sehr süße Methode auf Arrays ,
.find
. So können Sie ein Element wie dieses finden:Sie können ihm auch ein Objekt mit mehr Eigenschaften übergeben, um eine weitere "where-Klausel" hinzuzufügen.
Beachten Sie, dass Sugarjs einheimische Objekte erweitert, und einige Leute halten dies für sehr böse ...
quelle
find
. Mein Vorschlag ist, dass Sie, wenn Sie native Prototypen erweitern möchten, immer spezifischere Namen verwenden und die einfachsten zukünftigen Standardentwicklungen überlassen.Aufbauend auf der akzeptierten Antwort:
jQuery:
Oder CoffeeScript:
quelle
In letzter Zeit muss ich mich dem gleichen Problem stellen, bei dem ich den String aus einem riesigen Array durchsuchen muss.
Nach einiger Suche fand ich, dass es mit einfachem Code einfach zu handhaben sein wird:
Code:
Siehe https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/
quelle
Iterieren Sie über ein Element im Array. Überprüfen Sie für jeden Artikel, den Sie besuchen, die ID dieses Artikels. Wenn es ein Match ist, geben Sie es zurück.
Wenn Sie nur den Codez wollen:
Und dasselbe mit den Array-Methoden von ECMAScript 5:
quelle
Solange der Browser ECMA-262 , 5. Ausgabe (Dezember 2009) unterstützt, sollte dies funktionieren, fast einzeilig:
quelle
bFound
ist nur ein Boolescher Wert,true
wenn ein Element die erforderliche Bedingung erfüllt.Sie können dies auch in reinem JavaScript tun, indem Sie die eingebaute "Filter" -Funktion für Arrays verwenden:
Übergeben Sie nun einfach "id" anstelle von
key
"45" anstelle von "und"value
, und Sie erhalten das vollständige Objekt, das einer ID von 45 entspricht.quelle
Verwenden Sie
Array.prototype.filter()
Funktion.DEMO : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON
FILTER
quelle
.filter
Methodeobj.info
in einer verschachtelten Schleife.var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Wir können Jquery-Methoden verwenden
$.each()/$.grep()
oder
Verwenden Sie die ES6-Syntax:
Oder verwenden Sie Lodash https://lodash.com/docs/4.17.10#filter , Underscore https://underscorejs.org/#filter
quelle
Die Antwort von Aaron Digulla hat mir sehr gut gefallen, aber ich musste meine Reihe von Objekten behalten, damit ich sie später durchlaufen konnte. Also habe ich es geändert
quelle
Verwenden:
Es sollte ein Objekt mit der ID zurückgeben.
quelle
Diese Lösung kann auch hilfreich sein:
Ich habe es so gemacht,
$.grep
und wenn ein Objekt herausgefunden wird, gibt die Funktion das Objekt zurück und nicht ein Array.quelle
function will return the object, rather than an array
kann ein Fehler auftreten, aber ich denke, es hängt von den Benutzern ab.Ausgehend von der Antwort von aggaton ist dies eine Funktion, die tatsächlich das gewünschte Element zurückgibt (oder
null
wenn sie nicht gefunden wird), vorausgesetzt ,array
und einecallback
Funktion, die einen wahrheitsgemäßen Wert für das "richtige" Element zurückgibt:Denken Sie daran, dass dies auf IE8- nativ nicht funktioniert, da es nicht unterstützt wird
some
. Eine Polyfüllung kann bereitgestellt werden, alternativ gibt es immer die klassischefor
Schleife:Es ist tatsächlich schneller und kompakter. Wenn Sie das Rad jedoch nicht neu erfinden möchten, empfehle ich die Verwendung einer Utility-Bibliothek wie Unterstrich oder Lodash.
quelle
Kürzeste,
quelle
Betrachten Sie "axesOptions" als Array von Objekten mit einem Objektformat von {: field_type => 2 ,: fields => [1,3,4]}
quelle