질문 : 중첩 된 JavaScript 개체 키의 존재 여부 테스트
객체에 대한 참조가있는 경우 :
var test = {};
잠재적으로 (즉각적인 것은 아님) 다음과 같은 중첩 된 개체가 있습니다.
{level1: {level2: {level3: "level3"}}};
깊이 중첩 된 객체에서 속성의 존재를 확인하는 가장 좋은 방법은 무엇입니까?
alert(test.level1);
undefined
산출하지만 alert(test.level1.level2.level3);
실패합니다.
나는 현재 다음과 같은 일을하고 있습니다.
if(test.level1 && test.level1.level2 && test.level1.level2.level3) {
alert(test.level1.level2.level3);
}
하지만 더 나은 방법이 있는지 궁금합니다.
답변
멤버 중 하나가 null
또는 undefined
이고 멤버에 액세스하려고하면 예외가 발생 TypeError
원하지 않는 경우 단계별로 수행해야합니다.
catch
하거나 다음과 같이 여러 수준의 존재를 테스트하는 함수를 만들 수 있습니다.
function checkNested(obj /*, level1, level2, ... levelN*/) {
var args = Array.prototype.slice.call(arguments, 1);
for (var i = 0; i < args.length; i++) {
if (!obj || !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
ES6 업데이트 :
다음은 ES6 기능과 재귀를 사용하는 원래 함수의 더 짧은 버전입니다 (또한 적절한 마무리 호출 형식 임).
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
그러나 중첩 된 속성의 값을 얻고 그 존재를 확인하려는 경우 다음과 같은 간단한 한 줄 함수가 있습니다.
function getNested(obj, ...args) {
return args.reduce((obj, level) => obj && obj[level], obj)
}
const test = { level1:{ level2:{ level3:'level3'} } };
console.log(getNested(test, 'level1', 'level2', 'level3')); // 'level3'
console.log(getNested(test, 'level1', 'level2', 'level3', 'length')); // 6
console.log(getNested(test, 'level1', 'level2', 'foo')); // undefined
console.log(getNested(test, 'a', 'b')); // undefined
위의 함수를 사용하면 중첩 된 속성의 값을 가져올 수 있습니다 undefined
를 반환합니다.
업데이트 2019-10-17 :
선택적 연결 제안 이 ECMAScript위원회 프로세스의 3 단계에 도달했습니다 ?.
하면 토큰?를 사용하여 깊이 중첩 된 속성에 안전하게 액세스 할 수 있습니다. , 새로운 선택적 연결 연산자 :
const value = obj?.level1?.level2?.level3
액세스 된 수준 중 하나가 null
이거나 undefined
경우 식은 undefined
로 확인됩니다.
이 제안을 통해 메서드 호출을 안전하게 처리 할 수도 있습니다.
obj?.level1?.method();
상기 식을 생성 할 것이다 undefined
경우 obj
, obj.level1
또는 obj.level1.method
있는 null
또는 undefined
, 그렇지 않으면 그 함수를 호출한다.
선택적 연결 플러그인을 사용하여 Babel에서이 기능을 사용할 수 있습니다.
Babel 7.8.0 부터 ES2020은 기본적으로 지원됩니다.
Babel REPL 에서이 예제 를 확인하십시오.
업데이트 : 2019 년 12 월
선택적 연결 제안은 2019 년 12 월 TC39위원회 회의에서 마침내 4 단계에 도달했습니다. 이는이 기능이 ECMAScript 2020 Standard의 일부가됨을 의미합니다.
출처 : https://stackoverflow.com/questions/2631001/test-for-existence-of-nested-javascript-object-key
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
JSLint 또는 JSHint JavaScript 유효성 검사를 사용해야 하는 이유 (0) | 2021.11.04 |
---|---|
JavaScript의 객체 배열에서 고유 한 값을 얻는 방법 (0) | 2021.11.03 |
Java Hashmap : Value에서 Key를 얻는 방법 (0) | 2021.11.03 |
Java에서 함수를 매개 변수로 전달하는 방법 (0) | 2021.11.02 |
Jackson JSON 및 Hibernate JPA 문제가있는 무한 재귀 (0) | 2021.11.02 |