var book = {
member: {name: 100},
point: {value: 200}
};
function show(param){
for (var type in param){
typeof param[type] === "object" ? show(param[type]) : console.log(type + ":", param[type]);}
};
show(book);
// name: 100
// value: 200
```
1. show(book);
- 마지막 줄에서 show(book)를 호출하면서
- book 오브젝트를 파라미터 값으로 넘겨줍니다.
2. for (var type in param){...}
- for-in으로 파라미터로 받은 오브젝트 전개
3. typeof paam\[type] === "object" ? show(param\[type]) : console.log(type + ":", param\[type]);
4. param\[type] 타입이 "object" 이면
- show()를 호출
- 자신을 호출하면서 param\[type]을 넘겨줍니다.
- book\["member"]이므로 {name: 100}이 넘어 갑니다.
5. param\[type] 타입이 "object"가 아니면
- member: {name: 100}에서 {name: 100}을 읽은 것이므로 값을 출력합니다.
---
### \[정리시간\]
```javascript
debugger;
// 주어진 데이터
var member = {
Jan: {item: {title: "JS", amount: 100}, point: [10, 20, 30]},
Feb: {item: {title: "JS", amount: 200}, point: [40, 50, 60]}
};
// 배열이면 누적되는 값이 저장되는 변수 선언
// 계산을 해야하므로 단순히 선언만 하는 것이 아니라 초깃값으로 0을 할당해줬음
var result = 0;
// 배열의 엘리먼트를 더해 누적하게 만드는 reduce의 콜백 함수
function callback(prev, curr){
return prev + curr;
};
// 메인 함수 선언
function show(param){
// 파라미터로 오는 데이터가 오브젝트 형태여서 for-in문 활용
for (var type in param) {
// Array이면
if (Array.isArray(param[type]) === true){
// 배열의 값을 출력하고
console.log(param[type]);
// result에 배열의 값들을 누적합니다.
result += param[type].reduce(callback);
// 배열이 아닌 object이면
} else if (typeof param[type] === 'object') {
// 프로퍼티 이름과 값을 출력하고
console.log(type,":",param[type]);
// 재귀 호출을 통해 데이터를 끝까지 탐색
show(param[type]);
// 가장 안에있는 오브젝트의 프로퍼티 이름과 값을 출력
} else {
console.log(type,":",param[type]);
}
};
};
// 재귀 함수 호출
show(member);
// 누적한 값 출력
console.log(result);