Javascript Array to Object (ft, reduce)

예제

다음과 같이 객체를 담은 배열이 존재한다.

const items = [
  {id: 1, color: 'red'},
  {id: 2, color: 'blue'},
  {id: 3, color: 'red'}
]

다음과 같이 color를 key값을 갖는 객체로 만들어 보자.

{
  'red': [{id:1, color: 'red'}, {id:3, color: 'red'}]
  'blue': [{id:2, color: 'blue'}]
}

reduce를 사용해서 객체로 변환해 보자.

items.reduce((acc, item)=> {
  const {color}= item
  return {...acc, [color]: [...(acc[color] || []), item]}
}, {}) // 초기값을 빈객체로 reduce의 2번째 인자로 넘김

조금더 뜯어서 살펴보자

mdn에서 reduce를 살펴보자

mdn정의에 따르면 reduce는 리듀서(reducer)함수를 실행하고, 하나의 결과값을 반환한다.

arr.reduce(callback[, initialValue])

첫번째 인자로 콜백을 받고, 2번째 인자에 초기값을 넘긴다.

콜백은 4개의 인자를 받는다.

  1. 누산기 (acc) <== 현재 코드에서 사용함
  2. 현재 값 (cur) <== 현재 코드에서 사용함
  3. 현재 인덱스 (idx) (optional)
  4. 원본 배열 (src) (optional)

reducer를 살펴보자.

다시 우리가 작성한 코드를 살펴보자, reduce안에 첫번째 인자로 넘긴 리듀서(reducer)를 살펴보자

(acc, item)=> {
  const {color}= item
  return {...acc, [color]: [...(acc[color] || []), item]}
}

reducer의 파라미터

(acc, item)=>{
  ...
}

일단 파라미터(acc, item)는 위에서 설명한 콜백의 4개의 인자중에 1. 누산기(acc), 2.현재값(item)을 파라미터로 설정했다.

return 문을 살펴보자.

그리고 하나의 결과값을 만들어야 하기 때문에, return 를 한다. return 문을 조금더 살펴보자.

  return {...acc, [color]: [...(acc[color] || []), item]}

acc 누산기는 계속해서 이전에 누적된 값이다. 그렇기 때문에, 기존 객체에 합쳐야 하기 때문에 …spread 연산자를 사용해서, 이전의 결과값(acc)를 풀었다.

  [color]: [...(acc[color] || []), item]

그 다음은, 원래 우리가 할려고 했던 key: value 형태의 쌍을 구성하기 위한 작업이다. key를 구성할때 []안에 담아야지 key로 인식한다.

그 다음에 value는 배열의 형태로 담겨야 하고, 기존의 acc에서 key값(여기에서는 color)으로 찾는다. acc[color] 값이 없다면 빈배열을 할당한다. 역시나 value도 …spread 연산자를 통해서 기존의 값들을 넣는다, 그리고 ,다음은 현재의 item 객체를 넣는다.

comment

reduce라는 사용방법과 spread 연산자, key값으로 지정하는 방법, || operator 등등 여러가지 개념이 혼재되어 있어서, 처음에 이해하지 못했다. 하지만 하나씩 뜯어서 살펴보면 어렵지 않다. 그리고 앞으로 비슷한 일들이 있을때, 사용하면 유용할것 같다.

Ref