如何使用JS进行“null”或“undefined”的深度检查?

5
在一个Node.JS项目中,假设我从一个API或者其他结构化对象中得到了一个响应,其结构可能如下所示:
{
  data: {
    info: {
      user: {
        name: "Hercules",
        password: "Iamthegreatest!"
        email: "hercules@olymp.gr"
      }
    }       
  }
}

访问对象的成员非常容易。但是,在访问任何值之前检查其是否存在却很麻烦。
我可以假设数据始终存在。信息、用户、名称、密码和电子邮件可能存在,也可能不存在。可能存在一个有效的信息对象而没有用户,也可能存在一个有效的用户没有电子邮件地址。
这导致了以下代码:
if (data && data.info && data.info.user && data.info.user.email) {
  var email = data.info.user.email;
}

只需检查


if (data.info.user.email)
  // do something
}

如果任何对象不存在,将抛出错误。

有没有更简短的方法来深度检查此类结构的存在?


C# 6 引入了 ?. 运算符。你可以这样使用:var email = data?.info?.user?.email; 或许 JS 也会跟进。我记得 Groovy 是第一个实现它的语言。 - Richard Schneider
@RichardSchneider,也许JS不会... ;) - Moo-Juice
1
这里应该会用到Dotty - Paul
2个回答

3

从项目目录中的控制台,运行命令 npm install dotty

然后在代码的顶部使用以下语句导入dotty: var dotty = require('dotty')

如果obj是上面提到的对象,则可以调用

dotty.exists(obj, "data.info.user.email")

它将返回truefalse,而不是抛出错误。

请参阅https://www.npmjs.org/package/dotty


1

另一种选择,因为很多开发者已经在使用 Lodash,是使用 Lodash 的 get() 方法:

import _ from 'lodash';

let data = {
  info: {
    user: {
      email: 'user.email@example.com'
    }
  }
};

_.get(data, 'info.user.email');
// => 'user.email@example.com'
< p >
get() 的一个好处是它支持默认值,用于解决值为 undefined 的情况:

_.get(data, 'info.user.emailAddress', 'default.email@example.com');
// => 'default.email@example.com'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接