[JAVASCRIPT] 배열의 중복 값 개수 구하기 – REDUCE()

devCecy·2022년 3월 22일
3

지난 글에서는 reduce() 기본쓰임과, 누적된 값(accumulator)을 인자로 받는 특성을 이용하여 배열의 원소를 모두 더해보았다.

이번에는 누적된 값과 initialValue를 지정할 수 있는 특성을 이용해 배열 내의 중복된 값이 몇 개 있는지 구해보자!

const array = ['a', 'b', 'a', 'a', 'b'];

const result = array.reduce((accu, curr) => { 
  console.log('accu',accu, 'curr', curr, accu[curr])
  accu[curr] = (accu[curr] || 0)+1; // 객체에서 curr key값을 찾아 value값이 있으면 그 value에서 1을 더하고, 없다면 0을 할당하고 거기에 1을 더해준다. 
  return accu;
}, {});

console.log('result',result); // 'result' { a: 3, b: 2 }

reduce()가 어떤식으로 배열을 순회하는지 보기위해 중간에 console.log을 찍어주었는데, console.log만 가져와서 뜯어보면 이런식이다.

console.log('accu',accu, 'curr', curr, accu[curr])

'accu' {} 'curr' 'a' undefined  // 1번
'accu' { a: 1 } 'curr' 'b' undefined // 2번
'accu' { a: 1, b: 1 } 'curr' 'a' 1 // 3번
'accu' { a: 2, b: 1 } 'curr' 'a' 2
'accu' { a: 3, b: 1 } 'curr' 'b' 1
  1. initialValue 를 {}로 지정해주었기 때문에 accu(누적값)의 첫 값은 {}이다. 그리고 배열의 첫 값을 받는 curr는 ‘a’고, 빈 객체에서 ‘a’를 찾는 accu[curr]값은 undefined가 나온다. 아직 빈 객체라 ‘a’ key값의 value가 없기 때문이다.
  2. 1번에서 객체안에 ‘a’의 값이 없었기 때문에 0을 할당한 뒤 + 1해주었고, 두번째 curr값은 ‘b’다. 이번에도 역시 객체안에 ‘b’라는 key값은 존재하지 않기 때문에 accu[curr]값은 undefined다.
  3. 2번에서 ‘b’의 value값으로 0+1이 할당되었기 때문에 누적값은 {a: 1, b:1}이 되었다. 이후 부터는 객체안에 key값이 존재하면 그 value값에 1을 더해주고, 없다면 0을 할당한뒤 1을 더해주는 방식을 반복한다.

객체를 initialValue로 지정해주고 그 안에 key값이 있는지 확인해 value에 1씩 더해주는 방식으로 배열의 중복되는 원소 갯수를 구해보았다. 👊🏻

profile
🌈그림으로 기록하는 개발자🌈

1개의 댓글

comment-user-thumbnail
2023년 7월 26일

상세한 설명 덕에 쉽게 이해할 수 있었습니다 :)

답글 달기