如何检查对象中是否存在对象

时间:2011-07-01 12:59:06

标签: javascript object member literals

似乎以下用于检查对象成员是否存在的技术会产生错误,因为在检查之前尚未声明'bar'父对象,这意味着我必须在检查之前声明它或使用两个'typeof'表达式,其中任何一个都是多余的代码:

var foo = {},
    newVal = (typeof foo.bar.myVal !== 'undefined' ? foo.bar.myVal : null );

Error: foo.bar is undefined

那么,如何检查未申报对象中的成员是否存在而不产生错误?

我喜欢javascript,但有时......

6 个答案:

答案 0 :(得分:9)

只需使用以下代码即可完成:

var newVal = (foo && foo.bar && typeof foo.bar.myVal !== 'undefined') ? foo.bar.myVal : foo.bar.myVal

属性为null或未定义,它将被评估为false,因此上述代码将仅处理第一个'false'语句。

答案 1 :(得分:6)

var newVal = ('foo' in window && // could be typeof foo !== 'undefined' if you want all scopes
             'bar' in foo &&
             'myVal' in foo.bar) ? foo.bar.myVal : null;

为了公平对待javascript,它几乎就像自然语言一样。

答案 2 :(得分:3)

最简单的测试是:

if (foo && foo.bar) {
  // play with foo.bar.myVal  ... 
}

答案 3 :(得分:1)

你可以把它包装成一个方法:

function checkGraph(obj, graphPath)
{
  var parts = graphPath.split(".");
  var root = obj;

  for (var i = 0; i < parts.length; i++)
  {
    var part = parts[i];
    if (root[part] && root.hasOwnProperty(part))
      root = root[part];
    else
      return false;
  }

  return true;
}

您可以将其称为:

var foo = {},
    newVal = checkGraph(foo, "bar.myVal") ? foo.bar.myVal : null;

答案 4 :(得分:1)

正如Matthew Abbott在他的回复中给出的那样,你可以编写一个方法让它以后使用它,如果你做了很多潜入子属性,其中整个对象或链中的某个地方可以为空。以下是我使用lodash的实现。

checkGraph(obj, graphPath) {
    if (obj) {
      let root = obj;
      _.each(graphPath.split('.'), part => {
        if (root[part]) {
          root = root[part];
        } else {
          return false; // bad property
        }
      });
      return true;
    }
    return false; // bad object
  }

你可以这样调用这个方法:

if (this.checkGraph(object, 'property.subproperty') {
    // do thing
}

答案 5 :(得分:0)

还有另一种方法,您可以使用 Babel 之类的 JS转译器

if (foo?.bar) {
  // play with foo.bar.myVal  ... 
}