JavaScript, null / undefined [duplicate]에 대한 중첩 된 개체 속성을 확인하는 우아한 방법
이 질문에 이미 답변이 있습니다.
내가 때때로 가지고있는 "문제"는 내가 객체를 가지고 있다는 것 user = {}
입니다. 어딘가에 AJAX 호출이나 내가 이것을 한 후에 말합시다.
user.loc = {
lat: 50,
long: 9
}
다른 곳에서 user.loc.lat
존재 하는지 확인하고 싶습니다 .
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
뿐만 아니라.
이와 같은 상황을 확인하는 이상적인 방법은 무엇입니까?
다음과 같은 유틸리티 기능을 사용할 수 있습니다.
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) {...}
You can check value of null and undefined using typeof
If .loc
has value false
than you can try
if(user && user.loc && typeof(user.loc)!=="undefined"){...}
If you have a huge nested object than have a look at
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
Update: Try lodash.get
'developer tip' 카테고리의 다른 글
Python 용 시각적 프로파일 러가 있습니까? (0) | 2020.09.01 |
---|---|
Java unchecked : varargs 매개 변수에 대해 확인되지 않은 일반 배열 생성 (0) | 2020.09.01 |
Erlang의 99.9999999 % (나인 나인) 신뢰성 (0) | 2020.09.01 |
라우팅 : 현재 작업 요청 […]이 다음 작업 방법간에 모호합니다. (0) | 2020.09.01 |
0과 -0을 구별 할 수 있습니까? (0) | 2020.09.01 |