독서/자바스크립트 코딩의 기술

[자바스크립트] reduce로 api 배열 데이터 변환하기

zzocco94 2022. 12. 28. 10:17

API 데이터 변환 함수

API를 호출해서 배열 데이터를 받았다.

화면에서는 타입별로 데이터를 보여줘야 해서,
배열을 { 타입이름 : 아이템이름[] } 의 객체로 만드는 함수를 만들고 싶다.

 

API 데이터

const res = [
{
    id: 1,
    name: 'A',
    typeId: 1,
    typeName: 'typeA'
},
{
    id: 2,
    name: 'B',
    typeId: 2,
    typeName: 'typeB'
}
];

 

객체로 변환

const object = {
    typeA: ['A'],
    typeB: ['B'],
}

 

reduce

배열 데이터를 변환할 때 reduce를 유용하게 쓸 수 있다.
배열의 각 요소에 대해 주어진 reducer 함수를 실행하고, 결괏값을 반환한다.

 

문법

array.reduce(callback, initialValue);



객체 배열 👉 특정 key 값만 모은 배열
key 하나의 값만 모아야 한다면 map 메서드를 쓰는 것이 더 적절하나,
더 많은 값을 다루고 싶을 때는 reducer가 도움이 된다.

 

const colors = dogs.reduce((colors, dog) => {
    if (colors.includes(dog['색상'])) {
        return colors;
    }
    return [...colors, dog['색상']];
}, []);



객체 배열 👉 객체

const filters = dogs.reduce((filters, item) => {
    filters.breed.add(item['견종']);
    filters.size.add(item['크기']);
    filters.color.add(item['색상']);
    return filters;
},
{
    breed: new Set(),
    size: new Set(),
    color: new Set(),
});

 

구현

처음에는 forEach로 구현했으나, reduce로도 구현해보았다.
개인적으로 reduce가 배열을 변환한다는 목적이 더 명확하게 드러나는 것 같아서
변환할 때는 reduce를 사용하는 것이 더 좋을 것 같다.

 

forEach

const formatData = (res) => {
  const object = {};

  res.forEach(item => {
      cosnt { typeName, name } = item;

      // 1. 요소가 있을 때
      if(object[typeName]?.length) {
          object[typeName] = [...object[typeName], name];
          return;
      }

      // 2. 요소가 없을 때
      object[typeName] = [name];
  });
};

 

reduce

const formatData = (res) => {
    const object = res.reduce((object, item) => {
        const { typeName, name } = item;

        return {
            ...object,
            [typeName]: [...object[typeName], name],
        }
    }, {});
};

 

 

reduce dogs 사례 출처

: 자바스크립트 코딩의 기술 (길벗, 2019)을 학습하고 개인 학습용으로 정리한 내용입니다.
  API 데이터 사례는 창작한 내용입니다.