Как проверить, существует ли объект внутри объекта - PullRequest
8 голосов
/ 01 июля 2011

Кажется, что следующий метод проверки существования члена объекта приводит к ошибке, поскольку родительский объект 'bar' не был объявлен до проверки, что означает, что я должен объявить его перед проверкой или использовать выражения 'typeof', любое из которых будет избыточным кодом:

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

Error: foo.bar is undefined

Итак, как вы можете проверить, существует ли элемент в необъявленном объекте, не вызывая ошибки?

Я люблю JavaScript, но иногда ...

Ответы [ 6 ]

10 голосов
/ 01 июля 2011

Это можно сделать, просто используя следующий код:

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

Свойство имеет значение null или не определено, оно будет оценено как ложное, поэтому приведенный выше код будет обрабатываться только до первого оператора 'false'.

6 голосов
/ 01 июля 2011
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, который читается почти как естественный язык.

3 голосов
/ 01 июля 2011

Самый простой тест:

if (foo && foo.bar) {
  // play with foo.bar.myVal  ... 
}
1 голос
/ 06 октября 2017

Как сказал Мэттью Эбботт , в своем ответе вы можете написать метод, чтобы использовать его позже, если вы будете много погружаться в дочерние свойства, где весь объект или где-то в цепочке может быть нулевым.,Ниже моя реализация, использующая 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
}
1 голос
/ 01 июля 2011

Вы можете заключить его в метод:

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;
0 голосов
/ 22 мая 2019

Есть и другой способ - использовать JS транспортер , например Babel :

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