JavaScript, элегантный способ проверить вложенные свойства объекта для NULL / undefined [дубликат]



этот вопрос уже есть ответ здесь:




  • Тест на наличие вложенного ключа объекта JavaScript

    47 ответов



"проблема", которая у меня есть время от времени, заключается в том, что у меня есть объект, например user = {} и в ходе использования приложения это заполняется. Скажем, где-нибудь, после звонка AJAX или что-то еще, что я делаю это:



user.loc = {
lat: 50,
long: 9
}


в другом месте я хочу проверить, если .



if(user.loc.lat) {
// do something
}


если он не существует, это вызовет ошибку. Если user.loc.lat и undefined,user.loc конечно undefined как хорошо.



"Cannot read property 'lat' of null" - Dev Tools error


это означает, что мне нужно проверить это так:



if(user.loc) {
if(user.loc.lat) {
// do something
}
}


или



if(user.loc && user.loc.lat) {
// do something
}


это не очень красиво и больше мои объекты-это хуже - это очевидно (представьте себе 10 уровней вложенности).
Это удручает это if(user.loc.lat) не просто возвращается false если user.loc и undefined как хорошо.



каков идеальный способ проверить такие ситуации?

910   4  

4 ответов:

вы можете использовать функцию полезности такой:

get = function(obj, key) {
    return key.split(".").reduce(function(o, x) {
        return (typeof o == "undefined" || o === null) ? o : o[x];
    }, obj);
}

использование:

 get(user, 'loc.lat')     // 50
 get(user, 'loc.foo.bar') // undefined

или, чтобы проверить только если свойство существует, не получая его значение:

has = function(obj, key) {
    return key.split(".").every(function(x) {
        if(typeof obj != "object" || obj === null || ! x in obj)
            return false;
        obj = obj[x];
        return true;
    });
}

if(has(user, 'loc.lat')) ...

ну, javascript имеет try-catch. В зависимости от того, что вам на самом деле нужно сделать (т. е. что ваш else заявление будет выглядеть, если это undefined), что может быть то, что вы хотите.

пример:

try {
   user.loc.lat.doSomething();
} catch(error) {
   //report
}

вы можете объединить проверки с помощью lazy and:

if(user.loc && user.loc.lat) { ...

или, вы используете CoffeeScript и писать

user.loc?.lat ...

который будет запускать проверки для loc свойство и защита от пустых объектов.

попробуй такое if(user && user.loc && user.loc.lat) {...}

вы можете проверить значение null и undefined с помощью typeof

если .loc имеет значение false чем вы можете попробовать

if(user && user.loc && typeof(user.loc)!=="undefined"){...}

если у вас есть огромный вложенный объект, чем взглянуть на

источник.

function checkNested(obj /*, level1, level2, ... levelN*/) {
  var args = Array.prototype.slice.call(arguments),
      obj = args.shift();

  for (var i = 0; i < args.length; i++) {
    if (!obj.hasOwnProperty(args[i])) {
      return false;
    }
    obj = obj[args[i]];
  }
  return true;
}

var test = {level1:{level2:{level3:'level3'}} };

checkNested(test, 'level1', 'level2', 'level3'); // true
checkNested(test, 'level1', 'level2', 'foo'); // false

обновление: Попробуй лодашь.получить

Comments

    Ничего не найдено.