Frage Prüfen, ob ein Schlüssel in einem JavaScript-Objekt existiert?


Wie überprüfe ich, ob ein bestimmter Schlüssel in einem JavaScript-Objekt oder -Array vorhanden ist?

Wenn ein Schlüssel nicht existiert und ich versuche, darauf zuzugreifen, wird er false zurückgeben? Oder einen Fehler werfen?


2221
2017-07-08 13:21


Ursprung


Antworten:


Die Überprüfung auf Undefiniertheit ist keine genaue Art zu testen, ob ein Schlüssel existiert. Was ist, wenn der Schlüssel existiert, aber der Wert tatsächlich ist? undefined?

var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!

Sie sollten stattdessen die verwenden in Operator:

"key" in obj // true, regardless of the actual value

Wenn Sie prüfen möchten, ob ein Schlüssel nicht existiert, denken Sie daran, Klammern zu verwenden:

!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj   // ERROR!  Equivalent to "false in obj"

Wenn Sie insbesondere Eigenschaften der Objektinstanz (und nicht vererbte Eigenschaften) testen möchten, verwenden Sie hasOwnProperty:

obj.hasOwnProperty("key") // true

Für den Leistungsvergleich zwischen den Methoden, die sind in, hasOwnProperty und Schlüssel ist undefined, Sieh dir das an Benchmark


3074
2017-07-08 15:51



schnelle Antwort

Wie überprüfe ich, ob ein bestimmter Schlüssel in einem JavaScript-Objekt oder -Array vorhanden ist?   Wenn ein Schlüssel nicht existiert und ich versuche, darauf zuzugreifen, wird er false zurückgeben? Oder einen Fehler werfen?

Der direkte Zugriff auf eine fehlende Eigenschaft mithilfe des (assoziativen) Array-Stils oder -Objektstils gibt einen zurück nicht definiert Konstante.

Das langsam und zuverlässig im Betreiber und hasOwnProperty Methode

Wie bereits erwähnt, könnten Sie ein Objekt mit einer Eigenschaft haben, die mit einer "undefined" -Konstante verknüpft ist.

 var bizzareObj = {valid_key:  undefined};

In diesem Fall müssen Sie verwenden hasOwnProperty oder im Operator, um zu wissen, ob der Schlüssel wirklich da ist. Aber, Aber zu welchem ​​Preis?

Also, ich sage dir ...

im Betreiber und hasOwnProperty sind "Methoden", die den Property Descriptor-Mechanismus in Javascript verwenden (ähnlich wie Java-Reflektion in der Java-Sprache).

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

Der Property Descriptor-Typ wird verwendet, um die Manipulation und Verdinglichung von benannten Eigenschaftenattributen zu erklären. Werte des Property Descriptor-Typs sind Datensätze, die aus benannten Feldern bestehen, wobei der Name jedes Felds ein Attributname ist und sein Wert ein entsprechender Attributwert ist, wie in 8.6.1 angegeben. Außerdem kann jedes Feld vorhanden oder nicht vorhanden sein.

Auf der anderen Seite wird beim Aufruf einer Objektmethode oder eines Schlüssels der JavaScript-Mechanismus [[Get]] verwendet. Das ist viel schneller!

Benchmark

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

Comparing key access in JS.

Verwenden im Operator
var result = "Impression" in array;

Das Ergebnis war

12,931,832 ±0.21% ops/sec      92% slower 
Verwenden von hasOwnProperty
var result = array.hasOwnProperty("Impression")

Das Ergebnis war

16,021,758 ±0.45% ops/sec     91% slower
Direkter Zugriff auf Elemente (Klammernstil)
var result = array["Impression"] === undefined

Das Ergebnis war

168,270,439 ±0.13 ops/sec     0.02% slower 
Direkter Zugriff auf Elemente (Objektstil)
var result = array.Impression  === undefined;

Das Ergebnis war

168,303,172 ±0.20%     fastest

EDIT: Was ist der Grund, um eine Eigenschaft zu vergeben undefined Wert?

Diese Frage verwirrt mich. In Javascript gibt es mindestens zwei Referenzen für abwesende Objekte, um Probleme wie diese zu vermeiden: null und undefined.

null ist der primitive Wert, der die absichtliche Abwesenheit eines beliebigen Objektwerts darstellt, oder, kurz gesagt, der Bestätigt Mangel an Wert. Andererseits, undefined ist unbekannter Wert (nicht definiert). Wenn es eine Eigenschaft gibt, die später mit a verwendet wird richtig Wert in Betracht ziehen Verwendung null Referenz statt undefined weil im ersten Moment das Eigentum ist Bestätigt keinen Wert haben.

Vergleichen:

var a = {1: null}; 
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.:  the value is defined. 
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].

Beraten

Vermeiden Sie Objekte mit undefined Werte. Überprüfen Sie direkt, wann immer möglich und verwenden Sie null Initialisieren von Eigenschaftswerten Ansonsten benutze das Slow in Betreiber oder hasOwnProperty() Methode.

EDIT: 12.04.2018 - NICHT RELEVANT MEHR

Wie die Leute bemerkt haben, haben moderne Versionen der Javascript-Engines (mit Firefox-Ausnahme) den Ansatz für Zugriffseigenschaften geändert. Die aktuelle Implementierung ist für diesen speziellen Fall langsamer als die vorherige, aber der Unterschied zwischen Zugriffsschlüssel und Objekt ist vernachlässigbar.


224
2018-02-27 16:38



Es wird zurückkehren undefined.

var aa = {hello: "world"};
alert( aa["hello"] );      // popup box with "world"
alert( aa["goodbye"] );    // popup box with "undefined"

undefined ist ein spezieller konstanter Wert. So können Sie z.B.

// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
    // do something
}

Dies ist wahrscheinlich die beste Möglichkeit, nach fehlenden Schlüsseln zu suchen. Wie jedoch in einem Kommentar unten ausgeführt wird, ist es theoretisch möglich, dass Sie den tatsächlichen Wert haben möchten undefined. Ich habe das nie getan und kann mir keinen Grund dafür vorstellen, warum ich es jemals wollte, aber nur der Vollständigkeit halber kann man das verwenden in Operator

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}

114
2017-07-08 13:24



Das akzeptierte Antwort bezieht sich auf Objekt. Vorsicht mit dem in Operator auf Array um Daten anstelle von Schlüsseln zu finden:

("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)

So testen Sie vorhandene Elemente in einem Array: Am besten finden Sie heraus, ob sich ein Element in einem JavaScript-Array befindet.


22
2017-07-01 12:45



"key" in obj

Testet wahrscheinlich nur Objektattributwerte, die sich stark von Arrayschlüsseln unterscheiden


20
2018-04-25 15:45



Drei Möglichkeiten zu prüfen, ob eine Eigenschaft in einem JavaScript-Objekt vorhanden ist:

  1. !! obj.theProperty
    Konvertiert den Wert in bool. gibt TRUE für alle außer dem Wert 'false' zurück
  2. 'theProperty' in obj
    Gibt true zurück, wenn die Eigenschaft existiert, unabhängig von ihrem Wert (auch leer)
  3. obj.hasOwnProperty ('theProperty')
    Überprüft nicht die Prototypkette. (Da alle Objekte die toString-Methode haben, geben 1 und 2 true zurück, während 3 darauf false zurückgeben kann.)

Referenz:

http://book.mixu.net/node/ch5.html


20
2017-11-12 09:19



Wenn Sie verwenden Unterstrich.js Bibliothek dann Objekt / Array-Operationen werden einfach.

In Ihrem Fall kann _.has Methode verwendet werden. Beispiel:

yourArray = {age: "10"}

_.has(yourArray, "age")

kehrt zurück wahr 

Aber,

_.has(yourArray, "invalidKey")

kehrt zurück falsch


13
2018-05-29 19:37



Antworten:

if ("key" in myObj)
{
    console.log("key exists!");
}
else
{
    console.log("key doesn't exist!");
}

Erläuterung:

Das in Der Bediener prüft, ob der Schlüssel im Objekt vorhanden ist. Wenn Sie überprüft haben, ob der Wert nicht definiert ist: if (myObj["key"] === 'undefined'), könnte es zu Problemen kommen, da möglicherweise ein Schlüssel in Ihrem Objekt mit dem existiert undefined Wert.

Aus diesem Grund ist es viel besser, zuerst die in Operator und vergleichen Sie dann den Wert, der innerhalb des Schlüssels ist, sobald Sie bereits wissen, dass es existiert.


10
2018-06-22 02:29



Hier ist eine Hilfsfunktion, die ich sehr nützlich finde

Dies keyExists(key, search) kann verwendet werden, um einfach einen Schlüssel innerhalb von Objekten oder Arrays zu suchen!

Übergeben Sie einfach den Schlüssel, den Sie finden möchten, und suchen Sie obj (das Objekt oder das Array), in dem Sie es finden möchten.

function keyExists(key, search) {
    if (!search || (search.constructor !== Array && search.constructor !== Object)) {
        return false;
    }
    for (var i = 0; i < search.length; i++) {
        if (search[i] === key) {
            return true;
        }
    }
    return key in search;
}

Wie man es benutzt:

Suchen nach Schlüsseln in Arrays

keyExists('apple', ['apple', 'banana', 'orange']); // true
keyExists('fruit', ['apple', 'banana', 'orange']); // false

Suche nach Schlüsseln in Objekten

keyExists('age', {'name': 'Bill', 'age': 29 }); // true
keyExists('title', {'name': 'Jason', 'age': 29 }); // false

Es ist ziemlich zuverlässig und funktioniert gut über den Browser.


9
2018-03-05 12:56



vanila js

yourObjName.hasOwnProperty(key) : true ? false;

Wenn Sie überprüfen möchten, ob das Objekt in es205 mindestens eine Eigenschaft besitzt

Object.keys(yourObjName).length : true ? false

4
2018-01-25 15:39



 ES6 Lösung

verwenden Array#some und Object.keys. Es wird zurückkehren wahr wenn der angegebene Schlüssel im Objekt existiert oder falsch wenn nicht.

var obj = {foo: 'one', bar: 'two'};
    
function isKeyInObject(obj, key) {
    var res = Object.keys(obj).some(v => v == key);
    console.log(res);
}

isKeyInObject(obj, 'foo');
isKeyInObject(obj, 'something');

Einzeiliges Beispiel

console.log(Object.keys({foo: 'one', bar: 'two'}).some(v => v == 'foo'));


4
2018-03-26 15:45