JavaScript,检查null / undefined的嵌套对象属性的优雅方法

这个问题在这里已有答案:

  • 测试是否存在嵌套的JavaScript对象键                                     50个答案

我偶尔会遇到的一个“问题”是我有一个对象,例如: user.loc.lat并通过使用该应用程序的过程填充。 让我们说一下,在AJAX调用之后或者我这样做的事情:

user.loc = {
    lat: 50,
    long: 9
}

在另一个地方,我想检查user.loc.lat是否存在。

if (user.loc.lat) {
    // do something
}

如果它不存在,这将导致错误。 如果if(user.loc.lat)false,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级嵌套)。如果user.loc也是undefined,那么if(user.loc.lat)不仅仅会返回false

检查这种情况的理想方法是什么?

4个解决方案
116 votes

您可以使用这样的实用程序函数:

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')) ...
georg answered 2019-09-17T06:40:28Z
18 votes

好吧,javascript有try-catch。 根据您实际需要做的事情(即else声明如果是undefined),这可能就是您想要的。

例:

try {
   user.loc.lat.doSomething();
} catch(error) {
   //report
}
MarioDS answered 2019-09-17T06:40:56Z
6 votes

您可以使用lazy loc组合检查:

if(user.loc && user.loc.lat) { ...

或者,您使用CoffeeScript并编写

user.loc?.lat ...

这将运行loc属性的检查并防止空对象。

punund answered 2019-09-17T06:41:34Z
5 votes

试试这个if(user && user.loc && typeof(user.loc)!=="undefined"){...}

您可以使用typeof检查null和undefined的值

如果if(user && user.loc && typeof(user.loc)!=="undefined"){...}的价值比您可以尝试的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

Aamir Afridi answered 2019-09-17T06:42:38Z
translate from https://stackoverflow.com:/questions/23808928/javascript-elegant-way-to-check-nested-object-properties-for-null-undefined