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 как хорошо.
каков идеальный способ проверить такие ситуации?
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