[javascript] 배열내 중복 제거/카운트

Jenny·2023년 3월 15일
0

중복을 제외한 유니크한 문자 수를 카운트해서 반환하는 문제를 풀며 정리하는 글
ex) google -> g,o,l,e -> 4 반환


1. 중복 제거

1) set

  • set 객체는 중복되지 않는 유일한 값들의 집합
  • 요소 순서에 의미가 없으므로 인덱스로 요소에 접근할 수 없음
    배열에서 중복된 요소 제거시 유용하게 쓰임
const arr = [1,2,3,3,5];
const set = new Set(arr); //Set { 1, 2, 3, 5 }
const uniqueArr = [...set]; //[ 1, 2, 3, 5 ]
// 배열의 중복 요소 제거
const uniq = array => array.filter((v, i, self) => self.indexOf(v) === i);
console.log(uniq([2, 1, 2, 3, 4, 3, 4])); // [2, 1, 3, 4]

// Set을 사용한 배열의 중복 요소 제거
const uniq = array => [...new Set(array)];
console.log(uniq([2, 1, 2, 3, 4, 3, 4])); // [2, 1, 3, 4]

2) indexOf(), filter()

const arr = [1,2,3,3,5];
const uniqueArr = arr.filter((element,index) => {
  return arr.indexOf(element) === index;
});                          

3) forEach(), includes()

const arr = [1,2,3,3,5];
const uniqueArr = [];
arr.forEach((element) => {
	if(!uniqueArr.includes(element)) {
    	uniqueArr.push(element);
    }
});

2.중복 세기

1) forEach()

const arr = ['a','b','a','b','c'];

const result = {}; //중복된 값의 개수 저장을 위한 객체 선언
arr.forEach((x) => { //배열(arr)의 각 원소들을 순서대로 callback 함수에 전달
  result[x] = (result[x] || 0)+1; 
});

// 아래 코드는 result[x] = (result[x] || 0)+1; 가 의미하는 바와 같다. 
if(result[x]) {
	result[x] = result[x] + 1; //값이 이미 세팅되어있을경우,true
}else {
	result[x] = 0 + 1; //undefined일경우
             }
//처음에 배열의 첫번째 값 'a'가 들어오면 result[x], 즉 result.a는 undefined이다. 
//result.a가 undefined이므로 result에 a속성을 추가하고,0+1 (==1)을 세팅한다. (b도 마찬가지)
// 배열의 세번째 값 'a'가 들어오면, 이번에는 result.a의 값이 1로 세팅되어 있으므로, result.a의 값을 result.a + 1 (==2)로 세팅해서 카운트함

2) Map

  • Map은 객체를 key로 지정할 수 있다. 그래서 배열의 원소가 일반 문자열 , 숫자가 아닌 객체의 경우에도 key로 지정 간응!
const arr = ['a', 'b', 'a', 'b', 'c'];

const result = arr.reduce((accu,curr)=> {
  accu.set(curr, (accu.get(curr)||0) +1) ;
  return accu;
},new Map());

for (let [key, value] of result.entries()) {
  document.write(key + ' : ' + value + '<br>');//{"a":2,"b":2,"c":1}
}

3) reduce()

  • reduce()는 배열의 값을 순회하면서 배열의 값을 특정 형태로 누적하는데 사용
const arr = ['a', 'b', 'a', 'b', 'c'];

const result = arr.reduce((accu, curr) => { 
  accu[curr] = (accu[curr] || 0)+1; 
  return accu; //{"a":2,"b":2,"c":1}
}, {});

reduce는 쓰임이 많아서 따로 정리하면 좋을 것 같다
reduce

참고

profile
Developer로의 여정

0개의 댓글