Jak se vyhnout chybám typu „nelze přečíst vlastnost nedefinovaných“?

Ve svém kódu se zabývám polem, které má některé položky s mnoha objekty vnořenými do sebe, zatímco některé ne. Vypadá to asi takto:

// where this array is hundreds of entries long, with a mix
// of the two examples given
var test = [{'a':{'b':{'c':"foo"}}}, {'a': "bar"}];

Dělá mi to problémy, protože občas musím polem iterovat a nekonzistence mi hází takové chyby:

for (i=0; i<test.length; i++) {
    // ok on i==0, but 'cannot read property of undefined' on i==1
    console.log(a.b.c);
}

Jsem si vědom, že mohu říci if(a.b){ console.log(a.b.c)} , ale to je mimořádně únavné v případech, kdy je do sebe vnořeno až 5 nebo 6 objektů. Existuje nějaký jiný (snazší) způsob, jak to mohu nechat POUZE provést console.log pokud existuje, ale bez vyvolání chyby?

Odpověď

Aktualizovat :

  • Pokud používáte JavaScript v souladu s ECMAScript 2020 nebo novějším, podívejte se na volitelné řetězení.
  • TypeScript přidal podporu pro volitelné řetězení ve verzi 3.7.
// use it like this
obj?.a?.lot?.of?.properties

Řešení pro JavaScript před ECMASCript 2020 nebo TypeScript starší než verze 3.7 :

Rychlým řešením je použití pomocné funkce zkusit/chytit s funkcí šipky ES6:

function getSafe(fn, defaultVal) {
  try {
    return fn();
  } catch (e) {
    return defaultVal;
  }
}

// use it like this
console.log(getSafe(() => obj.a.lot.of.properties));

// or add an optional default value
console.log(getSafe(() => obj.a.lot.of.properties, 'nothing'));