嵌套javascript对象中的值检查(可能不存在)

嵌套javascript对象中的值检查(可能不存在),javascript,Javascript,有没有一种优雅简洁的方法可以避免在javascript中检查对象成员层次结构中的深层值 handlerInput.supportsDisplay = function() { return this.requestEnvelope.context && this.requestEnvelope.context.System && this.requestEnvelope.context.System.devi

有没有一种优雅简洁的方法可以避免在javascript中检查对象成员层次结构中的深层值

handlerInput.supportsDisplay = function() {
   return  this.requestEnvelope.context && 
           this.requestEnvelope.context.System && 
           this.requestEnvelope.context.System.device && 
           this.requestEnvelope.context.System.device.supportedInterfaces && 
           this.requestEnvelope.context.System.device.supportedInterfaces.Display;
}

这是欺骗,但您可以使用Lodash的
.get
函数

_.get(validations, "path.to.nested.prop");
从文件中

获取对象路径处的值。如果解析的值未定义,则返回defaultValue


我编写了一个NPM模块,允许您通过字符串路径进行查询


这是一支密码笔

对于您的用例:

import resolver from 'js-path-resolver'
const info = resolver(handlerInput, 'requestEnvelope.context.System.device.supportedInterface.Display', {onError:'continue'})
const hasDisplay = info.exists
const display = info.get()

简而言之,您拆分字符串,然后尝试解析路径,一次解析一个字符串。实现这一点有各种各样的问题,例如转义点、处理数组索引等,因此使用库使生活变得更加轻松。在这个库中,您还可以设置和删除解析的路径。

目前在纯JavaScript中没有简明的方法来实现这一点,除非您使用帮助函数或第三方库

在JavaScript中添加
?。
操作符(从2018年8月开始的第1阶段)是一个非常简单的过程,它可以完全满足您的需要

接受该建议后,您将能够使用
?。
而不是
任何可能缺少属性的地方,因此您的代码将成为:

// careful: this syntax is not available yet
var hasDisplay = handlerInput.requestEnvelope.context?.System?.device?.supportedInterfaces?.Display

我猜他是在问他是否可以不用点(a.b.c.d.e.f.g.h)检查嵌套值,而你只是用lodash检查。我不同意。他想用一行字来做这件事。这就是你想要的。我不同意这是作弊。洛达斯图书馆让很多事情变得更加清晰和安全。如果没有LoDash,我不会去任何地方:)可能的重复作为StackOverflow的管理者,你应该投票以重复的方式结束,而不是对已经被问过的问题提供一个新的答案。