Wie prüfe ich, ob ein bestimmter Schlüssel in einem JavaScript-Objekt oder -Array existiert?
Wenn ein Schlüssel nicht existiert und ich versuche, auf ihn zuzugreifen, wird dann "false" zurückgegeben? Oder wird ein Fehler ausgegeben?
Wie prüfe ich, ob ein bestimmter Schlüssel in einem JavaScript-Objekt oder -Array existiert?
Wenn ein Schlüssel nicht existiert und ich versuche, auf ihn zuzugreifen, wird dann "false" zurückgegeben? Oder wird ein Fehler ausgegeben?
Wenn Sie nach einem beliebigen Schlüssel in einer beliebigen Tiefe eines Objekts suchen und falsche Werte berücksichtigen wollen, sollten Sie diese Zeile für eine Hilfsfunktion in Betracht ziehen:
var keyExistsOn = (o, k) => k.split(".").reduce((a, c) => a.hasOwnProperty(c) ? a[c] || 1 : false, Object.assign({}, o)) === false ? false : true;
Ergebnisse
var obj = {
test: "",
locals: {
test: "",
test2: false,
test3: NaN,
test4: 0,
test5: undefined,
auth: {
user: "hw"
}
}
}
keyExistsOn(obj, "")
> false
keyExistsOn(obj, "locals.test")
> true
keyExistsOn(obj, "locals.test2")
> true
keyExistsOn(obj, "locals.test3")
> true
keyExistsOn(obj, "locals.test4")
> true
keyExistsOn(obj, "locals.test5")
> true
keyExistsOn(obj, "sdsdf")
false
keyExistsOn(obj, "sdsdf.rtsd")
false
keyExistsOn(obj, "sdsdf.234d")
false
keyExistsOn(obj, "2134.sdsdf.234d")
false
keyExistsOn(obj, "locals")
true
keyExistsOn(obj, "locals.")
false
keyExistsOn(obj, "locals.auth")
true
keyExistsOn(obj, "locals.autht")
false
keyExistsOn(obj, "locals.auth.")
false
keyExistsOn(obj, "locals.auth.user")
true
keyExistsOn(obj, "locals.auth.userr")
false
keyExistsOn(obj, "locals.auth.user.")
false
keyExistsOn(obj, "locals.auth.user")
true
Siehe auch dieses NPM-Paket: https://www.npmjs.com/package/has-deep-value
Gemäß MDN
Reflect ist ein eingebautes Objekt, das Methoden für abnehmbare JavaScript-Operationen bietet.
Die statische Methode Reflect.has() funktioniert wie der Operator in als eine Funktion.
var obj = {
a: undefined,
b: 1,
c: "hello world"
}
console.log(Reflect.has(obj, 'a'))
console.log(Reflect.has(obj, 'b'))
console.log(Reflect.has(obj, 'c'))
console.log(Reflect.has(obj, 'd'))
Das kommt darauf an.
Reflect.has()
ist langsamer als die anderen in der akzeptierten Antwort genannten Methoden (laut meinem Benchmark-Test). Aber, wenn Sie es nur ein paar Mal in Ihrem Code verwenden, sehe ich nicht viel Probleme mit diesem Ansatz.
Dabei wird zwar nicht unbedingt geprüft, ob ein Schlüssel existiert, aber es wird geprüft, ob ein Wert wahrheitsgemäß ist. Welche undefined
y null
fallen unter.
Boolean(obj.foo)
Diese Lösung funktioniert am besten für mich, weil ich typescript verwenden, und mit Zeichenfolgen wie so 'foo' in obj
o obj.hasOwnProperty('foo')
um zu prüfen, ob ein Schlüssel existiert oder nicht, bietet mir keine Intellisense.
hasOwnProperty.call(obj, key);
El unterstrich.js Weg -
if(_.has(this.options, 'login')){
//key 'login' exists in this.options
}
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
2 Stimmen
Alles (fast alles) in JavaScript ist ein Objekt oder kann in ein Objekt umgewandelt werden. Dies ist, wo pseudo-assoziative Arrays sind geboren, wie @PatrickM wies darauf hin.
0 Stimmen
Dieser Benchmark jsben.ch/#/WqlIl gibt Ihnen einen Überblick über die gebräuchlichsten Methoden, um diese Prüfung zu erreichen.
4 Stimmen
Eine schnelle Abhilfe, normalerweise wähle ich
property.key = property.key || 'some default value'
nur für den Fall, dass ich möchte, dass dieser Schlüssel mit einem Wert versehen ist