是否有一种优雅简洁的方法来避免执行此类操作来检查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;
}
答案 0 :(得分:1)
除非使用帮助器函数或第三方库,否则目前尚无简明的方式在纯JavaScript中实现此功能。
有一个proposal(在2018年8月的第1阶段)将?.
运算符添加到JavaScript中,它完全可以实现您想要的功能。
接受该建议后,您可以在可能缺少属性的任何地方使用?.
而不是.
,因此您的代码将变为:
// careful: this syntax is not available yet
var hasDisplay = handlerInput.requestEnvelope.context?.System?.device?.supportedInterfaces?.Display
答案 1 :(得分:0)
这是作弊,但您可以使用Lodash的_.get
功能
_.get(validations, "path.to.nested.prop");
来自文档
获取对象路径处的值。如果解析的值是未定义的,则将在其位置返回defaultValue。
答案 2 :(得分:0)
我编写了一个NPM模块,允许您通过字符串路径进行查询。
https://www.npmjs.com/package/js-path-resolver
http://www.twelvetone.tv/docs/developer-tools/npm-modules/js-path-resolver
这是一个Codepen https://codepen.io/Flamenco/pen/xaVKjR/?editors=1111
针对您的用例:
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()
简而言之,您将字符串拆分,然后尝试解析路径,一次解析一个字符串。实现此问题存在各种各样的问题,例如转义点,处理数组索引等,因此使用库可以使工作变得更加轻松。在此库中,您还可以设置和删除解析的路径。