安全地访问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
等等。