JavaScript,优雅的方式来检查嵌套的对象属性为NULL / undefined
一个“问题”,我现在每时每刻,我有一个对象,例如user = {}并通过使用该应用程序的过程中得到填充。 让我们说somwhere,在一个AJAX调用之后或者我做了这个: 
 user.loc = { lat: 50, long: 9 } 
 在另一个地方,我想检查user.loc.lat存在。 
 if(user.loc.lat) { // do something } 
 如果不存在,则会导致错误。 如果user.loc.lat是undefined , user.loc当然也是undefined 。 
 "Cannot read property 'lat' of null" - Dev Tools error 
这意味着我需要像这样检查它:
 if(user.loc) { if(user.loc.lat) { // do something } } 
要么
 if(user.loc && user.loc.lat) { // do something } 
 这不是很漂亮,我的对象越大越好 – 显然(想象10层嵌套)。  if(user.loc.lat)不只是返回false如果user.loc也是undefined ,这种types的if(user.loc.lat)我。 
什么是检查这种情况的理想方法?
你可以使用这样的效用函数:
 get = function(obj, key) { return key.split(".").reduce(function(o, x) { return (typeof o == "undefined" || o === null) ? o : o[x]; }, obj); } 
用法:
  get(user, 'loc.lat') // 50 get(user, 'loc.foo.bar') // undefined 
或者,只检查一个属性是否存在,而不检查它的值:
 has = function(obj, key) { return key.split(".").every(function(x) { if(typeof obj != "object" || obj === null || ! x in obj) return false; obj = obj[x]; return true; }); } if(has(user, 'loc.lat')) ... 
 那么,JavaScript有尝试赶上。 根据你实际需要做的事情(即,如果它是undefined ,你的else语句会是什么样的),这可能是你想要的。 
例:
 try { user.loc.lat.doSomething(); } catch(error) { //report } 
 你可以结合使用懒惰检查and : 
 if(user.loc && user.loc.lat) { ... 
或者,您使用CoffeeScript并写入
 user.loc?.lat ... 
 这将执行loc属性的检查和防止空的对象。 
 试试这个if(user && user.loc && user.loc.lat) {...} 
您可以使用typeof检查null和undefined的值
 如果.loc值为false ,则可以尝试 
 if(user && user.loc && typeof(user.loc)!=="undefined"){...} 
如果你有一个巨大的嵌套对象比看看
来源 。
 function checkNested(obj /*, level1, level2, ... levelN*/) { var args = Array.prototype.slice.call(arguments), obj = args.shift(); for (var i = 0; i < args.length; i++) { if (!obj.hasOwnProperty(args[i])) { return false; } obj = obj[args[i]]; } return true; } var test = {level1:{level2:{level3:'level3'}} }; checkNested(test, 'level1', 'level2', 'level3'); // true checkNested(test, 'level1', 'level2', 'foo'); // false 
更新:尝试lodash.get