【问题标题】:Verifying if a deep property exists in an object [duplicate]验证对象中是否存在深层属性[重复]
【发布时间】:2014-06-13 08:39:34
【问题描述】:

例如,我想查看response.objects[0].images[0].url 是否存在(并且不为空)

验证 url 属性是否存在于对象中的最正确方法是什么?

如果我这样做了

if (response.objects[0].images[0].url !== undefined && response.objects[0].images[0].url !== null {
  console.log(response.objects[0].images[0].url);
}

但是,如果url 之前的任何属性本身未定义或为空,则可能会导致问题。

我是否应该深入嵌套并验证前面的每个属性是否既不为空也不为未定义?

【问题讨论】:

  • if(x!=null) 在一次比较中同时命中 undefined 和 null...
  • 如果您正在检查的内容之前(嵌套不那么远)为 null ,那不回答您正在检查的内容为 null 的问题吗?
  • 把它放在一个 try catch 中,如果失败 - 你知道它或者它的父级为空,或者实际上检查每一层像这个答案一样的问题stackoverflow.com/questions/4676223/…
  • @ScottSelby:如果您检测到“相同的问题”,您应该将 vote to close 作为重复项
  • 谢谢,下次会做

标签: javascript jquery


【解决方案1】:

使用解析器:

function resolve(start) {
    return [].slice.call(arguments, 1).reduce(function(obj, prop) {
        return obj && obj[prop];
    }, start);
}


resolve(response, "objects", 0, "images", 0, "url");

如果它返回未定义,那么一路走来就出了问题......

【讨论】:

  • 怎么样:[].reduce.call(arguments, function(obj, prop){
  • @elclanrs:我将 1 提供给 slice(),它不仅仅是“为了传统”... ;)
  • 是的,刚刚注意到,我这样做了stackoverflow.com/questions/18891939/…。周围可能还有其他重复。
  • @elclanrs:点也很好,除非键有点。数组和参数一样有效,并且避免了与方便且诱人的字符串路径的任何名称冲突。我喜欢 String(arr).split(/[.,]/) 在受控环境中,我想要这样的灵活性......
  • @alex: slice 总是创建一个新数组,而且它是通用的,这意味着它通过使用 this 作为数组来处理类似数组的东西,例如参数和字符串。 slice 的第一个参数是左侧的起始位置,我们希望将其设为 1 而不是 0,以便为对象留出空间。总而言之,我们调用一个泛型方法 [].slice,将 this 设置为参数,并将 start pos 设置为 1,它输出一个新数组,如 this,截断为返回前指定。
猜你喜欢
  • 2013-11-28
  • 1970-01-01
  • 2021-10-01
  • 2021-04-24
  • 2018-01-01
  • 2022-10-09
  • 1970-01-01
相关资源
最近更新 更多