安全地访问Javascript嵌套对象

我有基于json的数据结构与包含嵌套对象的对象。 为了访问特定的数据元素,我一直链接对象属性的引用。 例如:

var a = bcd; 

如果b或bc未定义,则会失败并显示错误。 不过,如果它存在,我想获得一个值,否则只是未定义。 这样做的最好方法是什么,而不必检查链中的每个价值是否存在?

我想保持这个方法尽可能通用,所以我不必添加大量的辅助方法,如:

 var a = b.getD(); 

要么

 var a = helpers.getDFromB(b); 

我也想尝试避免try / catch结构,因为这不是一个错误,所以使用try / catch似乎错位。 这是合理的吗?

有任何想法吗?

您可以创build一个通用方法,该方法根据属性名称数组来访问元素,该属性名称被解释为通过属性的path:

 function getValue(data, path) { var i, len = path.length; for (i = 0; typeof data === 'object' && i < len; ++i) { data = data[path[i]]; } return data; } 

那么你可以这样称呼它:

 var a = getValue(b, ["c", "d"]); 

标准方法:

 var a = b && bc && bcd && bcde; 

是相当快,但不是太优雅(特别是较长的属性名称)。

使用函数来遍历JavaScipt对象属性既不高效,也不优雅。

试试这个:

 try { var a = bcde; } catch(e){} 

如果你确定以前没有使用或

 try { var a = bcde; } catch(e){ a = undefined; } 

如果你以前可能已经分配了它。

第一个选项可能会更快。

这是一个老问题,现在用es6的function,这个问题可以更容易地解决。

 const idx = (p, o) => p.reduce((xs, x) => (xs && xs[x]) ? xs[x] : null, o); 

感谢@sharifsbeat这个解决scheme 。

如果您希望拥有一个dynamic的访问权限,那么在ES6中您可以轻松地执行以下操作:

 function getNestedValue(o,...a){ var val = o; for (var prop of a) val = typeof val === "object" && val !== null && val[prop] !== void 0 ? val[prop] : undefined; return val; } var obj = {a:{foo:{bar:null}}}; console.log(getNestedValue(obj,"a","foo","bar")); console.log(getNestedValue(obj,"a","hop","baz")); 

可能这可能很简单:

 let a = { a1: 11, b1: 12, c1: { d1: 13, e1: { g1: 14 }}} console.log((a || {}).a2); => undefined console.log(((a || {}).c1 || {}).d1) => 13 

等等。