Подтвердить что ты не робот

Проверьте, существует ли объект-член во вложенном объекте

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

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

4b9b3361

Ответ 1

В общем, вы можете использовать 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

Ответ 2

Вы также можете попробовать/уловить 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);
  }
}

Ответ 3

Здесь один из способов: http://jsfiddle.net/9McHq/

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

alert( result );

Ответ 5

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

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;
}

Ответ 6

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.

Ответ 7

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

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

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

Ответ 8

Если вы можете использовать библиотеку 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