J o: Überprüfen ob Wert in mehrdimensionalem Objekt existiert

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

  1. @@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 🖖

    --
    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
    1. Hey Gunnar,

      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).

      Ach quatsch, doch so einfach. Vielen Dank!

      Gruß
      Jo

      1. Tach!

        if (foo.bar && foo.bar.baz), wenn die Existenz von foo vorausgesetzt werden kann und bar und baz 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.