친구알고리즘
업데이트:
알고리즘 문제는 아니고 다른회사에서 일하는 친구가 똥을하나 뒤집어 썼는데 (백엔드 노드를 다룸) 원래 파이썬만 하던친구라… 아무튼 어떤 객체 데이터를 가공해야하는 일이있어 되겠냐고 부탁이 들어와서 진행하게된 알고리즘 풀이이다.
Input
const rows = [
{
id: 1,
name: '남성',
parent: '0',
},
{
id: 2,
name: '여성',
parent: '0',
},
{
id: 3,
name: '아우터',
parent: '1',
},
{
id: 4,
name: '바지',
parent: '1',
},
{
id: 5,
name: '상의',
parent: '1',
},
{
id: 6,
name: '아우터',
parent: '2',
},
{
id: 7,
name: '반팔티',
parent: '5',
}
]
위와같은 데이터를
output
const data = {
id: 1,
name: '남성',
parent: '0',
children: [
{
id: 3,
name: '아우터',
parent: '1',
},
{
id: 4,
name: '바지',
parent: '1',
},
{
id: 5,
name: '상의',
parent: '1',
},
],
},
.
.
.
이런식의 데이터로 가공을 해야하는 일이었다.
id가 parent 와 매칭되어서 children 배열에 넣어줘야하고 넣어준 데이터는 제거된 상태로 리턴이 되어야한다.
나중에 찾아보니 이런걸 자료구조중에 해시테이블이라고 하는것같았다.
const result = rows.filter(category => {
category.children = []
rows.map((item, i) => {
if (category.id === Number(item.parent)) {
category.children.push(item)
}
})
return category.children.length !== 0 && category.parent === '0'
})
console.log(result)
위와같이 코드를 작성하여 데이터를 가공하였다.
각 카테고리별로 children 으로 빈 배열을 넣어주고 id 와 parent 를 매칭하여 해당 데이터의 children 에 push 를 해주었다. 그리고 children이 있는 품목과 결국엔 큰 카테고리는 parent 가 0으로 들어가는것같아 그것만 리턴하도록 해주었다.
쓰다보니 생각난건데 category.children.length !== 0
이거는 빠져도 될것같다.
최종코드
const result = rows.filter(category => {
category.children = []
rows.map((item, i) => {
if (category.id === Number(item.parent)) {
category.children.push(item)
}
})
return category.parent === '0'
})
console.log(result)
댓글남기기