Ich habe ein Array wie
vendors = [
{
Name: 'Magenic',
ID: 'ABC'
},
{
Name: 'Microsoft',
ID: 'DEF'
} //and so on goes array...
];
Wie überprüfe ich dieses Array, um festzustellen, ob Magenic vorhanden ist? Ich möchte keine Schleife machen, es sei denn, ich muss. Ich arbeite mit möglicherweise ein paar tausend Datensätzen.
AKTUALISIERT
Da dies ein beliebter Beitrag war, dachte ich, ich würde etwas Neues teilen, das ich gefunden habe. Und es scheint, dass @CAFxX dies bereits geteilt hat! Ich sollte diese öfter lesen. Ich bin auf https://benfrain.com/understanding-native-javascript-array-methods/ gestoßen .
vendors.filter(function(vendor){ return vendor.Name === "Magenic" })
Mit ECMAScript 2015 ist die Verwendung der neuen Pfeilfunktionen noch einfacher:
vendors.filter(vendor => vendor.Name === "Magenic")
javascript
arrays
David Lozzi
quelle
quelle
Antworten:
Bearbeiten 2018 : Diese Antwort stammt aus dem Jahr 2011, bevor Browser Array-Filtermethoden und Pfeilfunktionen weitgehend unterstützt hatten. Schauen Sie sich die Antwort von CAFxX an .
Es gibt keine "magische" Möglichkeit, in einem Array ohne Schleife nach etwas zu suchen. Selbst wenn Sie eine Funktion verwenden, verwendet die Funktion selbst eine Schleife. Was Sie tun können, ist aus der Schleife auszubrechen, sobald Sie das finden, wonach Sie suchen, um die Rechenzeit zu minimieren.
quelle
'Magenic'
es sich irgendwo anders im Objekt befindetKeine Notwendigkeit, das neu zu erfinden
RadSchleife, zumindest nicht explizit (mit Pfeilfunktionen , nur moderne Browser ):oder noch besser :
BEARBEITEN: Wenn Sie Kompatibilität mit miesen Browsern benötigen, ist Ihre beste Wahl:
quelle
some
Kurzschluss auftreten kann, sobald ein Objekt mitname === "Magenic"
gefunden wurde. Mitfilter
überprüft es jedes Element bis zum Ende des Arrays und erstellt ein neues Array-Element, das der Bedingung entspricht, und überprüft dann dielength
Keine Schleife notwendig. Drei Methoden, die mir in den Sinn kommen:
Array.prototype.some ()
Dies ist die genaueste Antwort auf Ihre Frage, dh "Überprüfen Sie, ob etwas vorhanden ist", was ein booles Ergebnis impliziert. Dies ist wahr, wenn es 'Magen'-Objekte gibt, andernfalls falsch:
Array.prototype.filter ()
Dies gibt ein Array aller 'Magenic'-Objekte zurück, auch wenn es nur eines gibt (gibt ein Ein-Element-Array zurück):
Wenn Sie versuchen, dies zu einem Booleschen Wert zu erzwingen, funktioniert dies nicht, da ein leeres Array (keine 'Magen'-Objekte) immer noch wahr ist. Also einfach
magenicVendors.length
in deiner Bedingung verwenden.Array.prototype.find ()
Dies gibt das erste 'Magenic'-Objekt zurück (oder
undefined
falls es keine gibt):Dies zwingt zu einem booleschen Okay (jedes Objekt ist wahr,
undefined
ist falsch).Hinweis: Ich verwende den Anbieter ["Name"] anstelle des Anbieters. Name wegen der seltsamen Schreibweise der Eigenschaftsnamen.
Hinweis 2: Kein Grund, bei der Überprüfung des Namens lose Gleichheit (==) anstelle von strikter Gleichheit (===) zu verwenden.
quelle
Die akzeptierte Antwort funktioniert immer noch, aber jetzt haben wir eine native ECMAScript 6-Methode
[Array.find][1]
, um den gleichen Effekt zu erzielen.MDN zitieren:
Siehe meinen jsfiddle-Link. Es gibt eine Polyfüllung für IE, die von Mozilla bereitgestellt wird
quelle
return ele.id == '2'
, aber +1 für eine gute ES6-Lösung.push if <0 || splice(index, 1)
hier ist mein etwas aktualisierter Code:const index = this.selected.indexOf(this.selected.find(s => s.id == passedObj.id))
So würde ich es machen
array.some()
Die Methode prüft, ob ein Array mindestens einen Wert enthält, der den Kriterien entspricht, und gibt einen Booleschen Wert zurück. Ab hier können Sie gehen mit:quelle
Es sei denn, Sie möchten es wie folgt umstrukturieren:
was du tun kannst
if(vendors.Magnetic)
Sie müssen eine Schleife durchführen
quelle
Gemäß der ECMAScript 6-Spezifikation können Sie verwenden
findIndex
.const magenicIndex = vendors.findIndex(vendor => vendor.Name === 'Magenic');
magenicIndex
wird entweder halten0
(das ist der Index im Array) oder-1
wenn es nicht gefunden wurde.quelle
Da hat das OP die Frage gestellt, ob der Schlüssel existiert oder nicht .
Eine elegantere Lösung, die mit der ES6-Reduktionsfunktion einen Booleschen Wert zurückgibt, kann sein
Hinweis: Der Anfangsparameter von reduct ist a.
false
Wenn das Array den Schlüssel hat, wird true zurückgegeben.Hoffe, es hilft für eine bessere und sauberere Code-Implementierung
quelle
reduce
ist der Akkumulator und nicht dasvendor
Objekt. Dies prüftfalse.Name === "Magenic"
jede Schleife und gibt false zurückSie können nicht, ohne wirklich in das Objekt zu schauen.
Sie sollten wahrscheinlich Ihre Struktur ein wenig ändern, wie
Dann können Sie es einfach wie einen Lookup-Hash verwenden.
quelle
Sie müssen eine Schleife machen, daran führt kein Weg vorbei.
Natürlich können Sie eine Bibliothek wie linq.js verwenden , um dies angenehmer zu gestalten:
( Eine Demo finden Sie unter jsFiddle. )
Ich bezweifle, dass linq.js schneller sein wird als eine einfache Schleife, aber es ist sicherlich flexibler, wenn die Dinge etwas komplizierter werden.
quelle
Testen auf Array-Elemente:
JS Bietet Array-Funktionen, mit denen Sie dies relativ einfach erreichen können. Sie sind die folgenden:
Array.prototype.filter
: Nimmt eine Rückruffunktion auf, die ein Test ist, wird das Array dann mit dem Rückruf iteriert und gemäß diesem Rückruf gefiltert. Ein neues gefiltertes Array wird zurückgegeben.Array.prototype.some
: Nimmt eine Rückruffunktion auf, die ein Test ist, das Array wird dann mit dem Rückruf iteriert, und wenn ein Element den Test besteht, wird der boolesche Wert true zurückgegeben. Andernfalls wird false zurückgegebenDie Einzelheiten lassen sich am besten anhand eines Beispiels erklären:
Beispiel:
Browserunterstützung:
Diese 2 Funktionen sind
ES6
Funktionen, die möglicherweise nicht von allen Browsern unterstützt werden. Um dies zu überwinden, können Sie eine Polyfüllung verwenden. Hier ist die Polyfüllung fürArray.prototype.some
(von MDN):quelle
Möglicherweise ist es zu spät, aber das Javascript-Array verfügt über zwei Methoden
some
undevery
Methoden, die einen Booleschen Wert zurückgeben und Ihnen dabei helfen können.Ich denke, es
some
wäre am besten geeignet für das, was Sie erreichen wollen.Einige überprüfen, ob eines der Objekte im Array die angegebene Bedingung erfüllt.
Jeder überprüft, ob alle Objekte im Array die angegebene Bedingung erfüllen.
quelle
const array1 = [{name:'Mike'},{name:'Alice'}]; console.log(array1.every(item => item.name !== 'Mike'));
es sollte wahr seinsome
werde meine Antwort aktualisieren.Wenn Sie jquery verwenden, können Sie grep nutzen, um ein Array mit allen übereinstimmenden Objekten zu erstellen:
und verwenden Sie dann das Ergebnisarray:
quelle
Korrigieren Sie mich, wenn ich falsch liege. Ich hätte eine
forEach
Methode wie diese verwenden können.Heutzutage bin ich daran gewöhnt, weil es einfach und selbsterklärend ist. Vielen Dank.
quelle
Sie können dies seine Arbeit für mich versuchen.
quelle
Sie können lodash verwenden . Wenn die lodash-Bibliothek für Ihre Anwendung zu schwer ist, sollten Sie unnötige Funktionen entfernen, die nicht verwendet werden.
Dies ist nur eine Möglichkeit, dies zu tun. Ein anderer kann sein:
console.log(arr);
Das obige Beispiel kann auch ohne Verwendung von Bibliotheken wie den folgenden umgeschrieben werden :
Hoffe meine Antwort hilft.
quelle
Viele Antworten hier sind gut und ziemlich einfach. Wenn Ihr Objektarray jedoch einen festen Wertesatz hat, können Sie den folgenden Trick verwenden:
Ordnen Sie den gesamten Namen eines Objekts zu.
Jetzt können Sie dieses DirtyObj immer wieder ohne Schleife verwenden.
quelle
Um ein Objekt mit einem anderen zu vergleichen, kombiniere ich eine for in-Schleife (zum Durchlaufen von Objekten) und some (). Sie müssen sich keine Sorgen machen, dass ein Array außerhalb der Grenzen usw. liegt, sodass Code gespart wird. Dokumentation zu .some finden Sie hier
Eine alternative Möglichkeit, ein Objekt mit einem anderen zu vergleichen, besteht darin, eine verschachtelte for-Schleife mit Object.keys (). Length zu verwenden, um die Anzahl der Objekte im Array abzurufen. Code unten:
Um Ihre genaue Frage zu beantworten: Wenn Sie nur nach einem Wert in einem Objekt suchen, können Sie eine einzelne for-Schleife verwenden.
quelle
Alternativ können Sie Folgendes tun:
quelle
var without2 = (arr, args) => arr.filter(v => v.id !== args.id);
Beispiel:without2([{id:1},{id:1},{id:2}],{id:2})
Ergebnis: ohne2 ([{id: 1}, {id: 1}, {id: 2}], {id: 2})
quelle
quelle
Mein Ansatz zur Lösung dieses Problems besteht darin, ES6 zu verwenden und eine Funktion zu erstellen, die die Prüfung für uns durchführt. Der Vorteil dieser Funktion besteht darin, dass sie in Ihrem gesamten Projekt wiederverwendet werden kann, um alle Arrays von Objekten zu überprüfen , die mit
key
undvalue
überprüft werden sollen.GENUG SPRECHEN, SEHEN WIR DEN CODE
Array
Funktion
Anruf / Nutzung
quelle
Ich würde lieber mit Regex gehen.
Wenn Ihr Code wie folgt lautet:
ich würde empfehlen
quelle