[47일차] 재귀연습문제-nestedEvenSum

저요·2022년 11월 8일

2022 100th day challenge

목록 보기
47/97

서론

회시을 다녀오느라 글 쓰는게 늦어졌다...그래도 오늘 할 일은 마무리해야지 하고 자려던 몸을 일으켜 지금 이렇게 컴퓨터 앞에 앉았다. 오늘은 두 번째 재귀연습문제 nestedEvenSum을 풀이해보려고 한다. 그리고 갑자기 궁금해져서 내일은 재귀연습문제 풀이를 잠깐 쉬어가면서 const와 let그리고 var의 차이와 hoisting에 대해서 배워보려고 한다.

문제

nestedEvenSum

nested Objects가 포함하고 있는 모든 짝수를 더한 값을 반환하는 nestedEvenSum함수를 재귀적으로 구현해라.

nested Objects?

nested Objects의 설명을 보면 nested는 동사로 사용된다. nested는 동사로는 '둥지를 튼다'는 의미를 가지고 있다. 따라서, nested Objects는 object안에 또 다른 object가 둥지를 튼 것 처럼 포함된 object를 의미한다.

nested Objects의 특징

document안에 같은 필드 이름이 key로 존재 할 수 있지만, 전체적으로 접근할 때의 이름은 독특해야만한다.

//해당 예시는 IBM 에서 가져왔습니다.
{"isbn": "123-456-222",  
 "author": 
    {
      "lastname": "Doe",
      "firstname": "Jane"
    },
"editor": 
    {
      "lastname": "Smith",
      "firstname": "Jane"
    },
  "title": "The Ultimate Database Study Guide",  
  "category": ["Non-Fiction", "Technology"]
 }
 //다음과 같이 author과 editor안에 lastname, firstname이 동일하게 사용될 수 있지만,
 //결국에 접근할때의 full access name은 독특해야만 한다.
 //obj.author.lastname, obj.editor.lastname 이렇게 서로 필드명이 같아도 중복되지 않도록.

우리는 이런 식의 여러가지가 중첩된 object를 상대해야한다.

해답솔루션

오늘은 나만의 솔루션은 작성하지 못했다.
그러니 해답솔루션의 풀이로 대체하려고 한다. 나중에 나만의 솔루션으로 문제를 다시 풀고 나면 이 글에 추가하도록 하겠다.

function nestedEvenSum (obj, sum=0) {
    for (var key in obj) {
        if (typeof obj[key] === 'object'){
            sum += nestedEvenSum(obj[key]);
        } else if (typeof obj[key] === 'number' && obj[key] % 2 === 0){
            sum += obj[key];
        }
    }
    return sum;
}

작동원리

  1. object와 sum을 디폴트 0으로 인자로 받아서 시작한다.
  2. for...in을 사용해서 객체의 key에 접근한다.
  3. 만약에 해당 key의 값이 object면 nestedEvenSum를 재귀호출한다.
  4. objcet가 아닐때까지 반복한다.
  5. key의 값이 number이고, 짝수이면 sum에 더하고 return 한다.
  6. return한 값을 sum에 더하며 전달한다.

for루프를 이용해서 key값을 전부확인하며 짝수를 계산해서 sum에 추가했다.
처음에 나는 object.key()를 이용해서 객체에 접근하려 했었는데 이 방법이 더 깔끔한것 같다.
하지만 다음에 나만의 솔루션을 다시 설계할 때에 object.key()를 다시 활용해 볼까도 싶다.

for...in?

여기서 사용된 for...in이란 루프에 대해서 한 번 짚고 넘어가려고 한다.
보통 배열을 쓸 때는 for...of를 사용했기 때문에 다음과같은 for...in 루프는 나에게 생소했다. 배열에서도 for...in을 사용할 수가 없는데, 그 이유는 for...in은 임의의 순서로 데이터를 반환하기 때문에 순서가 중요한 배열에서는 사용할 수 없다.

문법은 다음과 같다.

for (const variable in object) {
  statement
}

출처

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
https://www.ibm.com/docs/no/db2/11.5?topic=documents-json-nested-objects
https://www.udemy.com/share/105zfq3@FERHyLrgDBehvJINPU3fK0RCkDVIefvhdki463twPytdwzD-SvDO0Gg3JBut_JbtEg==/

profile
웹개발

0개의 댓글