회시을 다녀오느라 글 쓰는게 늦어졌다...그래도 오늘 할 일은 마무리해야지 하고 자려던 몸을 일으켜 지금 이렇게 컴퓨터 앞에 앉았다. 오늘은 두 번째 재귀연습문제 nestedEvenSum을 풀이해보려고 한다. 그리고 갑자기 궁금해져서 내일은 재귀연습문제 풀이를 잠깐 쉬어가면서 const와 let그리고 var의 차이와 hoisting에 대해서 배워보려고 한다.
nestedEvenSum
nested Objects가 포함하고 있는 모든 짝수를 더한 값을 반환하는 nestedEvenSum함수를 재귀적으로 구현해라.
nested Objects의 설명을 보면 nested는 동사로 사용된다. nested는 동사로는 '둥지를 튼다'는 의미를 가지고 있다. 따라서, nested Objects는 object안에 또 다른 object가 둥지를 튼 것 처럼 포함된 object를 의미한다.
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;
}
for루프를 이용해서 key값을 전부확인하며 짝수를 계산해서 sum에 추가했다.
처음에 나는 object.key()를 이용해서 객체에 접근하려 했었는데 이 방법이 더 깔끔한것 같다.
하지만 다음에 나만의 솔루션을 다시 설계할 때에 object.key()를 다시 활용해 볼까도 싶다.
여기서 사용된 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==/