在我的代码中,我处理了一个数组,其中包含一些条目,其中许多对象彼此嵌套,而有些则没有。它看起来像以下内容:
// where this array is hundreds of entries long, with a mix // of the two examples given var test = [{'a':{'b':{'c':"foo"}}}, {'a': "bar"}];
这给我带来了问题,因为我有时需要遍历数组,而不一致给我带来了如下错误:
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); }
我知道我可以说if(a.b){console.log(a.b.c)},但这在最多嵌套5个或6个对象的情况下非常繁琐。有没有其他(更简便的)方法可以让它仅在console.log存在的情况下执行,而不会引发错误?
if(a.b){console.log(a.b.c)}
更新 :
TypeScript在[3.7版中增加了对可选链接的支持。
// use it like this obj?.a?.lot?.of?.properties
ECMASCript 2020或早于3.7版的TypeScript之前的JavaScript解决方案 :
一个快速的解决方法是将try / catch辅助函数与ES6 箭头函数一起使用:
function getSafe(fn, defaultVal) { try { return fn(); } catch (e) { return defaultVal; } } // use it like this getSafe(() => obj.a.lot.of.properties); // or add an optional default value getSafe(() => obj.a.lot.of.properties, 'nothing');
工作片段:
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'));