프로그래밍 언어/JAVA

중첩 된 JavaScript 개체 키의 존재 여부 테스트

Rateye 2021. 11. 3. 10:30
728x90
반응형
질문 : 중첩 된 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
728x90
반응형