Проверьте, существует ли член объекта во вложенном объекте - PullRequest
24 голосов
/ 13 января 2011

Есть ли более простой способ, чем использовать ___ in object для проверки существования каждого уровня объекта для проверки существования одного члена?

Более кратко: как проверить, существует ли someObject.member.member.member.value ?

Ответы [ 8 ]

32 голосов
/ 13 января 2011

В общем, вы можете использовать if(property in object), но для вложенных членов это будет все еще громоздко.

Вы можете написать функцию:

function test(obj, prop) {
    var parts = prop.split('.');
    for(var i = 0, l = parts.length; i < l; i++) {
        var part = parts[i];
        if(obj !== null && typeof obj === "object" && part in obj) {
            obj = obj[part];
        }
        else {
            return false;
        }
    }
    return true;
}

test(someObject, 'member.member.member.value');

DEMO

6 голосов
/ 08 ноября 2012

Вы также можете попробовать / поймать TypeError?

try {
  console.log(someObject.member.member.member.value);
} catch(e) {
  if (e instanceof TypeError) {
    console.log("Couldn't access someObject.member.member.member.value");
    console.log(someObject);
  }
}
4 голосов
/ 13 января 2011

Вот один из способов: http://jsfiddle.net/9McHq/

var result = ((((someObject || {}).member || {}).member || {}).member || {}).value;

alert( result );
3 голосов
/ 08 декабря 2014
2 голосов
/ 13 апреля 2013

Здесь есть функция safeRead, определенная здесь, в кодовом коде , которая позволяет safeRead вложенных свойств, т. Е.

safeRead(foo, 'bar', 'jim', 'jam');

, если какое-либо из свойств равно нулю или не определено, возвращается пустая строка - полезнодля форматирования / интерполяции строк

2 голосов
/ 13 января 2011
if (someObject.member && someObject.member.member &&
    someObject.member.member.member && someObject.member.member.member.value) ...

или аналогично:

var val = foo.bar && foo.bar.jim && foo.bar.jim.jam && foo.bar.jim.jam.value;

Это не будет «работать», если какое-либо конкретное значение окажется null, false, 0 или "" (пустая строка), но с возможным исключением окончательного значения, это кажется вряд ли так.

Также обратите внимание, что typeof ____ !== "undefined" не является правильным тестом, чтобы увидеть, есть ли у объекта свойство. Вместо этого вы должны использовать ___ in object, например, if ("member" in someObject). Это потому, что вы можете установить для свойства явное значение undefined, которое отличается от удаления его с помощью delete someObject.member.

2 голосов
/ 13 января 2011

Что-то вроде (предупреждение: непроверенный код впереди)

var testProperty = function(obj, proplist) {
   for (var i=0; i < proplist.length; i++) {
      if (obj.hasOwnProperty(proplist[i])) {
         obj = obj[proplist[i]];
      } else {
        return false;
      }
   }
   return true;
}
0 голосов
/ 29 сентября 2016

Если вы можете использовать библиотеку lodash, у нее очень элегантное решение: hasIn .

_.hasIn(someObject, 'member.level1.level2.level3');

например,

var obj = {'x': 999, 'a': {'b': {'c': 123, 'd': 234}}}
// => undefined

_.hasIn(obj, 'x')
// => true

_.hasIn(obj, 'a.b.d')
// => true

_.hasIn(obj, 'a.b.e')
// => false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...