Überprüfen ob Wert in mehrdimensionalem Objekt existiert
J o
- javascript
Moin,
ich stolpere immer wieder über eine Kleinigkeit die ich bisher noch nicht zu meiner Zufriedenheit lösen konnte.
Wie über prüft man ohne Fehler ob ein Wert in einem mehrdimensionalem Objekt vorhanden ist oder nicht, wenn ein übergeordnete Eigenschaft existiert oder nicht. Zur Verdeutlichung:
var foo = {}; // es gibt stehts ein Objekt foo
foo.bar = {}; // existiert nicht permanent
foo.bar.baz = {}; // existiert ebenfalls nicht permanent
// falls foo.bar.baz existiert, existiert auch foo.bar.baz.foz
foo.bar.baz.foz = 123;
// wie frage ich ohne Fehler und möglichst einfach ob foo.bar.baz existiert?
if( typeof(foo.bar.baz) !== 'undefined' ) {
// Falls foo.bar nicht existiert kommt logischerweise folgender Fehler :
// Uncaught TypeError: Cannot read property 'baz' of undefined
}
if( typeof(foo.bar) !== 'undefined' ) {
if( typeof(foo.bar.baz) !== 'undefined' ) {
// Gibt zwar keinen Fehler aus aber das Konstrukt wird schnell unübersichtlich
}
}
// Natürlich auch Inline möglich aber unschön
var x = (typeof(foo.bar) !== 'undefined') ? (typeof(foo.bar.baz) !== 'undefined') ? foo.bar.baz.foz : y : y;
Gibt es da eine schicke Lösung die ich bisher noch nicht gefunden habe?
Gruß
Jo
@@J o
// wie frage ich ohne Fehler und möglichst einfach ob foo.bar.baz existiert?
if (foo.bar && foo.bar.baz)
, wenn die Existenz von foo
vorausgesetzt werden kann und bar
und baz
Objekte sind.
Oder if ('bar' in foo && 'baz' in foo.bar)
.
LLAP 🖖
Hey Gunnar,
if (foo.bar && foo.bar.baz)
, wenn die Existenz vonfoo
vorausgesetzt werden kann undbar
undbaz
Objekte sind.Oder
if ('bar' in foo && 'baz' in foo.bar)
.
Ach quatsch, doch so einfach. Vielen Dank!
Gruß
Jo
Tach!
if (foo.bar && foo.bar.baz)
, wenn die Existenz vonfoo
vorausgesetzt werden kann undbar
undbaz
Objekte sind.
Wenn foo nicht zwangsläufig da ist, dann noch eine Stufe davorhängen:
if (foo && foo.bar && foo.bar.baz)
Oder
if ('bar' in foo && 'baz' in foo.bar)
.Ach quatsch, doch so einfach. Vielen Dank!
In Javascript gibt es keinen null-conditional Operator wie beispielsweise in C#, da könnte man foo?.bar?.baz
notieren und der Ausdruck ergibt null, wenn Teile davon null sind. In Javascript hingegen prüft man da nur aus falsy. Ein Objekt ist immer truthy, und null/undefined ist falsy, weswegen das obige Konstrukt funktioniert und auch gern so verwendet wird.
dedlfix.