Wie überprüfe ich, ob ein bestimmter Schlüssel in einem JavaScript-Objekt oder -Array vorhanden ist?
Wenn ein Schlüssel nicht vorhanden ist und ich versuche, darauf zuzugreifen, wird er dann false zurückgeben? Oder einen Fehler werfen?
javascript
arrays
object
Adam Ernst
quelle
quelle
property.key = property.key || 'some default value'
, nur für den Fall, dass dieser Schlüssel mit einem gewissen Wert vorhanden sein sollAntworten:
Das Überprüfen auf Undefiniertheit ist keine genaue Methode, um zu testen, ob ein Schlüssel vorhanden ist. Was ist, wenn der Schlüssel vorhanden ist, der Wert jedoch tatsächlich
undefined
?Sie sollten stattdessen den
in
Operator verwenden:Wenn Sie überprüfen möchten, ob kein Schlüssel vorhanden ist, denken Sie daran, Klammern zu verwenden:
Wenn Sie insbesondere auf Eigenschaften der Objektinstanz (und nicht auf geerbte Eigenschaften) testen möchten, verwenden Sie
hasOwnProperty
:Aus Performance - Vergleich zwischen den Methoden , die sind
in
,hasOwnProperty
und Schlüssel ist ,undefined
finden Sie in diesem Benchmarkquelle
schnelle Antwort
Wenn Sie direkt auf eine fehlende Eigenschaft mit einem (assoziativen) Array- oder Objektstil zugreifen, wird eine undefinierte Konstante zurückgegeben.
Der langsame und zuverlässig in Operator und hasOwnProperty Verfahren
Wie bereits erwähnt, können Sie ein Objekt mit einer Eigenschaft haben, die einer "undefinierten" Konstante zugeordnet ist.
In diesem Fall müssen Sie hasOwnProperty oder in operator verwenden , um festzustellen , ob der Schlüssel wirklich vorhanden ist. Aber zu welchem Preis?
Also, ich sage dir ...
in operator und hasOwnProperty sind "Methoden", die den Property Descriptor-Mechanismus in Javascript verwenden (ähnlich der Java-Reflektion in der Java-Sprache).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
Auf der anderen Seite wird beim Aufrufen einer Objektmethode oder eines Objektschlüssels der Javascript-Mechanismus [[Get]] verwendet. Das geht viel schneller!
Benchmark
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Verwendung im OperatorDas Ergebnis war
Verwenden von hasOwnPropertyDas Ergebnis war
Direkter Zugriff auf Elemente (Klammerstil)Das Ergebnis war
Direkter Zugriff auf Elemente (Objektstil)Das Ergebnis war
EDIT: Was ist der Grund, einer Eigenschaft den
undefined
Wert zuzuweisen ?Diese Frage verwirrt mich. In Javascript gibt es mindestens zwei Referenzen für fehlende Objekte, um solche Probleme zu vermeiden:
null
undundefined
.null
ist der primitive Wert, der das absichtliche Fehlen eines Objektwerts oder kurz gesagt den bestätigten Wertmangel darstellt. Andererseitsundefined
ist ein unbekannter Wert (nicht definiert). Wenn es eine Eigenschaft gibt, die später mit einem geeigneten Wert verwendet wird, ziehen Sie die Verwendung einernull
Referenzundefined
in Betracht, anstatt zu bestätigen , dass der Eigenschaft im ersten Moment ein Wert fehlt.Vergleichen Sie:
Beraten
Vermeiden Sie Objekte mit
undefined
Werten. Überprüfen Sie diesnull
nach Möglichkeit direkt und verwenden Sie es , um Eigenschaftswerte zu initialisieren. Verwenden Sie andernfalls den langsamenin
Operator oder die langsamehasOwnProperty()
Methode.EDIT: 12/04/2018 - NICHT MEHR RELEVANT
Wie bereits erwähnt, haben moderne Versionen der Javascript-Engines (mit Firefox-Ausnahme) den Ansatz für Zugriffseigenschaften geändert. Die aktuelle Implementierung ist in diesem speziellen Fall langsamer als die vorherige, aber der Unterschied zwischen Zugriffsschlüssel und Objekt ist vernachlässigbar.
quelle
delete hash[key]
ist viel langsamer alshash[key] = undefined
. In diesem Fall macht es für mich natürlich keinen Sinn, denin
Operator zu benötigen , aber es dient als Gegenbeispiel zu „Wir sollten immer vermeiden, den Wert auf undefiniert zu setzen“.Es wird zurückkehren
undefined
.undefined
ist ein spezieller konstanter Wert. Sie können also sagen, zDies ist wahrscheinlich der beste Weg, um nach fehlenden Schlüsseln zu suchen. Wie in einem Kommentar unten ausgeführt, ist es jedoch theoretisch möglich, dass Sie den tatsächlichen Wert haben möchten
undefined
. Ich musste das nie tun und kann mir keinen Grund vorstellen, warum ich es jemals wollte, aber der Vollständigkeit halber können Sie denin
Operator verwendenquelle
var undefined = 42;
. Wenn Sie auf undefinierte Requisiten testen, sollten Sie immer verwenden((typeof variable) === "undefined")
.undefined
ist keine beschreibbare Eigenschaft gemäß der Spezifikation ecma-international.org/ecma-262/5.1/#sec-15.1.1.3Die akzeptierte Antwort bezieht sich auf Objekt . Beachten Sie, dass Sie den
in
Operator auf Array verwenden , um Daten anstelle von Schlüsseln zu finden:So testen Sie vorhandene Elemente in einem Array: Der beste Weg, um festzustellen, ob sich ein Element in einem JavaScript-Array befindet?
quelle
Testet wahrscheinlich nur Objektattributwerte, die sich stark von Array-Schlüsseln unterscheiden
quelle
Drei Möglichkeiten, um zu überprüfen, ob eine Eigenschaft in einem Javascript-Objekt vorhanden ist:
!!obj.theProperty
Konvertiert den Wert in bool. Gibt
true
für alle außer demfalse
Wert zurücktheProperty
' in obj Gibttrue zurück, wenn die Eigenschaft existiert, unabhängig von ihrem Wert (auch leer).
obj.hasOwnProperty('theProperty')
Überprüft nicht die Prototypenkette. (Da alle Objekte die
toString
Methode haben, geben 1 und 2 true zurück, während 3 false zurückgeben kann.)Referenz:
quelle
var a = {a : undefined, b : null}; !!a.a **will return false**
!!obj.theProperty
ist keine Lösung, um zu überprüfen, ob ein Objekt eine Eigenschaft mit dem Namen hattheProperty
. Es schlägt fehlundefined
,0
NaN
""
Wenn Sie die Bibliothek underscore.js verwenden, werden Objekt- / Array-Operationen einfach.
In Ihrem Fall kann die Methode _.has verwendet werden. Beispiel:
gibt true zurück
Aber,
gibt false zurück
quelle
Antworten:
Erläuterung:
Der
in
Bediener prüft, ob der Schlüssel im Objekt vorhanden ist. Wenn Sie überprüft haben, ob der Wert undefiniert istif (myObj["key"] === 'undefined')
, können Probleme auftreten, da möglicherweise ein Schlüssel mit demundefined
Wert in Ihrem Objekt vorhanden ist.Aus diesem Grund ist es viel besser, zuerst den
in
Operator zu verwenden und dann den Wert im Schlüssel zu vergleichen, sobald Sie bereits wissen, dass er existiert.quelle
Hier ist eine Hilfsfunktion, die ich sehr nützlich finde
Dies
keyExists(key, search)
kann verwendet werden, um einen Schlüssel in Objekten oder Arrays einfach nachzuschlagen!Übergeben Sie ihm einfach den Schlüssel, den Sie suchen möchten, und suchen Sie nach obj (dem Objekt oder Array), in dem Sie es finden möchten.
Es war ziemlich zuverlässig und funktioniert gut browserübergreifend.
quelle
Array.indexOf
Methode verwenden können? (wenn Sie nach einem Wert suchen, das ist)vanila js
Wenn Sie überprüfen möchten, ob das Objekt in es2015 mindestens eine Eigenschaft hat
quelle
ES6-Lösung
mit
Array#some
undObject.keys
. Es wird true zurückgegeben, wenn ein bestimmter Schlüssel im Objekt vorhanden ist, oder false, wenn dies nicht der Fall ist.Einzeiliges Beispiel.
quelle
Wir können benutzen -
hasOwnProperty.call(obj, key);
Der unterstrich.js Weg -
quelle
Der einfachste Weg zu überprüfen ist
zum Beispiel:
Der Rückgabewert als true impliziert, dass der Schlüssel im Objekt vorhanden ist.
quelle
Für diejenigen, die
lodash
in ihr Projekt aufgenommen haben:Es gibt eine lodash _.get- Methode, die versucht, "tiefe" Schlüssel zu erhalten:
Dadurch wird effektiv überprüft, ob dieser Schlüssel, wie tief er auch sein mag , definiert ist, und es wird kein Fehler ausgegeben, der den Programmfluss beeinträchtigen könnte, wenn dieser Schlüssel nicht definiert ist.
quelle
Dies prüft zwar nicht unbedingt, ob ein Schlüssel vorhanden ist, prüft jedoch die Richtigkeit eines Wertes. Welche
undefined
undnull
fallen unter.Boolean(obj.foo)
Diese Lösung funktioniert am besten für mich, da ich Typoskript verwende und solche Zeichenfolgen verwende
'foo' in obj
oder umobj.hasOwnProperty('foo')
zu überprüfen, ob ein Schlüssel vorhanden ist oder nicht, bietet mir Intellisense nicht.quelle
Wenn Sie in einer beliebigen Tiefe eines Objekts nach einem Schlüssel suchen und Falsey-Werte berücksichtigen möchten, ziehen Sie diese Zeile für eine Dienstprogrammfunktion in Betracht:
Ergebnisse
Siehe auch dieses NPM-Paket: https://www.npmjs.com/package/has-deep-value
quelle
quelle
In der 'Array'-Welt können wir Indizes als eine Art Schlüssel betrachten. Was überrascht, ist, dass der
in
Operator (der für Objekte eine gute Wahl ist) auch mit Arrays arbeitet. Der zurückgegebene Wert für nicht vorhandenen Schlüssel istundefined
quelle
yourArray.indexOf (yourArrayKeyName)> -1
wahr
falsch
quelle
Dieses Beispiel kann die Unterschiede zwischen verschiedenen Methoden demonstrieren. Ich hoffe, es wird Ihnen helfen, das richtige für Ihre Bedürfnisse auszuwählen:
quelle
Neue großartige Lösung mit JavaScript Destructuring :
Überprüfen Sie die andere Verwendung von JavaScript Destructuring
quelle