[알고리즘] JSON 객체 깊이만큼 조회하기

GDana
4 min readSep 8, 2019

--

JSON 형태의 데이터가 주어지면 객체로 구성된 배열 안에서 원하는 값을 조회하는 알고리즘을 풀게되었다. 하지만 한번에 풀어내지 못했어서 다시 한번 풀어본다.

let DATA = {
"el" : [
{
"name" : "Joe",
"age" : "20"
},
{
"name" : "Mary",
"age" : "27",
"book" : [
{
"name" : "Blow",
"age" : "15"
},
{
"name" : "Blow",
"age" : "15",
"book" : [
{
"name" : "kelly",
"age" : "29"
}
]
}
]
}
]
}

문제

DATA 객체와 찾고자하는 이름의 문자열이 주어지면 인자값과 동일한 값을 지닌 객체를 반환해야 한다. 단 다차원 객체 안에 있는 값이라면 객체가 담겨있는 깊이만큼 반환해야 한다.

objByName(data.el, "kelly")//반환값
{
"name" : "Mary",
"age" : "27",
"book" : [
{
"name" : "Blow",
"age" : "15"
},
{
"name" : "Blow",
"age" : "15",
"book" : [
{
"name" : "kelly",
"age" : "29"
}
]
}
]
}

오답풀이

가장 먼저 객체를 조회하고자 접근했던 메서드부터 잘못되었었다. 주어진 데이터는 객체인데 배열 메서드로 접근을 시도했기 때문에 계속해서 undefined 가 반환되었다.

function objByName(data, name){
let result
data.forEach(function(el){
if(el.name === name){
result = el
return result
}
if(el.book){
return objByName(el.book, name)
}
})
}

그래서 값은 찍히나 싶어서 확인했던 console.log(el) 의 값은 {name:"kelly", age:"29"} 로 name을 가지고 있는 해당 객체만을 반환했다. 원하는 값을 던지지 못하는 이유로, 중간에 예외를 던지지 않고 중간에 멈추지 않는 forEach의 특성으로 추측했다.

그래서

for문으로 변경하고 값을 던지기는 하지만 객체의 깊이만큼 출력하지 않은 문제는 해결되지 않았다.

그렇다면 JSON 객체에 대한 문제이기 때문에 조금 더 JSON 과 관련된 메서드로 접근하면 되지 않을까 하는 생각이 들었고 해결을 위한 메서드로 JSON.stringfy()JSON.parse() 를 사용했다.

통과한 풀이

function objByName(data, name){
let result
for(let i = 0; i < data.length; i++){
if(data[i].name === name){
data = JSON.stringify(json[i])
result = JSON.parse(data)
return result
}
if(data[i].hasOwnProperty('book'){
return objByName(data[i].book, name)
}
}

문제가 통과되면서도 왜 저 메서드만으로 통과된 것일까 생각해보니 사실상 JSON 메서드가 아니여도 result = data[i] 로도 원하는 값은 출력이 되었었다.

그렇다면 객체의 깊이만큼 출력하도록 했던 부분은 뭘까?

하고 다시 살펴보니 인자값에 만족하는 값이 있는지 체크하는 if 부분을 재귀하고 싶어서 사용했던 return objByName(data[i].book, name) 구문이 객체의 깊이만큼 출력할 수 있도록 해주었다.

최근 재귀를 사용하면서 조금은 이해했다고 생각했는데 이번에 사용했던 재귀는 재귀가 돌아가면서 출력되는 형태도 제대로 이해하지 못하고 사용했던 것 같다. 역시 공부는 제대로.

--

--