【问题标题】:How to check if Object and its properties exist?如何检查对象及其属性是否存在?
【发布时间】:2020-06-20 06:11:30
【问题描述】:

我从 API 调用中收到一个对象。我要检查:

  1. 如果对象存在
  2. 对象的属性是否有我要找的属性

假设我期待以下对象:

success.response.data.users.items.list

现在我想知道这个list 对象是否存在。

我试过了:

  • typeof success.response.data.users.items.list !== "undefined"

    我得到的错误:TypeError: Cannot read property 'data' of undefined

  • success.hasOwnProperty("response.data.users.items.list")

    这总是评估为假,因为hasOwnProperty 显然无法检查多级对象。

  • success.response.data.users.items.hasOwnProperty("list")

    我得到的错误:TypeError: Cannot read property 'data' of undefined

是否有任何现代且快速的检查方法?

【问题讨论】:

  • 既然有可用的语言功能,为什么还要使用 lodash?
  • 问题的根源在于success 没有名为response 的属性。正如威尔詹金斯在他的回答中所说,您需要检查链的所有先前级别。

标签: javascript ecmascript-6 ecmascript-5


【解决方案1】:

如果您愿意,optional chaining 是您的最佳选择:

success?.response?.data?.users?.items?.list || {} 

如果没有,您只需要在尝试访问子属性之前检查每个对象是否存在,或者使用带有默认值的 ES6 解构(尽管对于深度嵌套的对象来说非常粗糙):

const { response: { data: { users: { items: { list = {} } = {} } = {} } = {} } = {} } = success || {}

【讨论】:

  • 对不起,我忘了添加,但我的列表也是一个对象。不幸的是,可选链接对我来说并不是一个真正的选择。
  • 如果它是一个对象,它并没有真正改变解决方案......虽然已经更新
【解决方案2】:

如果可选链接不是一个选项,您可以在这些行中使用一些东西:

success && success.response && success.response.data && 
success.response.data.users && success.response.data.users.items && success.response.data.users.items.list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 2019-03-27
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多