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

时间:2018-08-26 17:23:51

标签: javascript

是否有一种优雅简洁的方法来避免执行此类操作来检查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;
}

3 个答案:

答案 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()
简而言之,您将字符串拆分,然后尝试解析路径,一次解析一个字符串。实现此问题存在各种各样的问题,例如转义点,处理数组索引等,因此使用库可以使工作变得更加轻松。在此库中,您还可以设置和删除解析的路径。