如何检查ObjectA内的objectB是否存在值,是否存在

时间:2019-08-29 21:01:37

标签: javascript

假设我们想要变量val中的值。

场景1:

Var ObjectA = {ObjectB:{val:"text"}}

如果我们想在val中获得价值,我们可以像ObjectA.ObjectB.val一样进行访问。 我们会得到"text"

方案2:

Var ObjectB = {}

如果我想获取val中的值(不存在),并且如果我尝试像ObjectA.ObjectB.val那样访问 我们会得到

  

未捕获的TypeError:无法读取未定义的属性“ val”           在:1:5

规则是

  1. 我们不能将任何值设置为null或初始化任何值。我们只会获取这些值并必须使用它们。
  2. 如果ObjectB中存在ObjectA,则并不意味着val存在于ObjectB中。

我只想知道变量val中是否存在一个值而不会干扰其他任何事情。

2 个答案:

答案 0 :(得分:2)

我将按顺序检查每件事:

if(ObjectA && ObjectA.ObjectB && ObjectA.ObjectB.val) {
    // Do something with ObjectA.ObjectB.val
}

如果这种结构对您来说太笨拙,那么就会想到另外两种可能性:

  • 在每个阶段填写默认值,即((ObjectA || {}).ObjectB || {}).val
  • 仅测试最内层的值,但在try...catch块内(如果缺少外层值之一,则静默丢弃不可避免的错误)。

但是,与&&-chaining版本相比,它们都更难读且性能较差,因此,仅当您的链很长时,我才会考虑使用它们。

答案 1 :(得分:0)

如果您要查找的密钥过于嵌套,则可以使用lodash中的get之类的工具(如果密钥不存在,您也可以添加默认值)。

您可以通过以下两种方式检查是否存在:

let myVal = null;
if (ObjectA && ObjectA.ObjectB && ObjectA.ObjectB.val) myVal = val;

此解决方案的一些注意事项是,如果val的值为false,例如,如果值为0false(您可以阅读更多有关{ {3}})的值仍为null。您可以通过使用一元运算符typeof来避免这种情况:

let myVal = null;
if (typeof ObjectA !== "undefined" && typeof ObjectA.ObjectB !== "undefined" && typeof ObjectA.ObjectB.val !== "undefined") myVal = val;