Bleeding edge

fetch로 카테고리별로 분류하기 본문

Javascript

fetch로 카테고리별로 분류하기

codevil 2022. 7. 9. 14:49

react강의를 들으면서, fecth로 얻은 json파일을 카테고리별로 저장하는 방법을 배웠었다. 문제를 간단하기위해, 받는 테스트케이스를 아래와 같이 작성하기로 하였다.

const list = [
  { id: "1", name: "one", category: "a" },
  { id: "2", name: "twp", category: "b" },
  { id: "3", name: "three", category: "a" },
];

위의 케이스의 경우에 케이스가 a, b 두가지가 존재한다 만일 분류를 한다면,

{
  a: [
    { id: '1', name: 'one', category: 'a' },
    { id: '3', name: 'three', category: 'a' }
  ],
  b: [ { id: '2', name: 'twp', category: 'b' } ]
}

다음과 같이 분류가 되어야한다. 강의 내에서는

  list.reduce((acc, cur) => {
    if (acc.hasOwnProperty(cur.category)) {
      return { ...acc, [cur.category]: [...acc[cur.category], cur] };
    } else {
      return { ...acc, [cur.category]: [cur] };
    }
  }, {})

다음과 같이 사용하였다. 

reduce의 default value를 {}로 하고, 저장된 key값이 없으면 [cur], 저장된 key값이 있으면 [...acc[cur.category], cur] 저장된 acc에서 cur.category키 값을 호출하여 값을 추가한다.

 if문부터 else까지 4줄이 추가되는 것을 보며 좀 더 심플하게 쓸 수 있지않을까 고민을 하다가

  list.reduce(
    (acc, cur) =>
      acc.hasOwnProperty(cur.category)
        ? { ...acc, [cur.category]: [...acc[cur.category], cur] }
        : { ...acc, [cur.category]: [cur] }, {}
  )

3항 연산자로 조금 더 깔끔하게 써봤다. 하지만 아무래도, if else정도만 생략된 정도니 더 줄일 수 있을지 않을까.. 하고 검색해봤는데, rest 파라미터(...)에서 문제가 많이 생겼다 그래서 괄호를 적절하게 사용하였다.

  list.reduce((acc, cur) => {
    return {
      ...acc,[cur.category]: [...(acc[cur.category] ? acc[cur.category] : []), cur],
    };
  }, {})

 

마찬가지로 삼항연산자를 사용하였지만, 조건부로 rest 파라미터를 사용하여 한줄로 매우 깔끔해졌다.

'Javascript' 카테고리의 다른 글

Queue를 class로 구현해보자.  (0) 2022.10.30
클린코드 작성하기  (0) 2022.07.10
Map의 저장방법 두가지  (0) 2022.06.27
map.get(key) 대신, map.get(value) 만들기  (0) 2022.06.10
TypeError: xxxxxxxxxxx is not iterable  (0) 2022.05.20