배열 중복값 제거

Updated:

배열의 중복값 제거하는 방법

case1: reduce를 이용한 방법

let arr = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];

let cancel = arr.sort().reduce((acc, cur) => {
  const length = acc.length; // 1.누적값(배열)의 길이를 구한 변수를 선언
  if (length === 0 || acc[length - 1] !== cur) {
    // 2.배열의 길이가 0이거나 배열안의 값과 기존 배열의 값이 다르면이라는 조건
    acc.push(cur); // 조건절로 걸러진 값을 초깃값에 담아줍니다.
  }
  return acc;
}, []);

reduce는 누적값과 현재 순회를하는 값에 대한 정보를 알 수 있습니다. 먼저, 누적값의 길이를 구하고 조건으로 해당 값이 없거나 값이 같지 않다면 중복되는 일을 줄일 수 있기 때문에 해당 조건을 주었습니다.

case2: set을 이용하기

const arr = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
const set = new Set(arr); // set을 이용하여 중복값을 제거 해당 리턴 타입은 "객체로 반환됩니다.
const result = [...set]; // 스프레드 연산자를 사용하여 기존 객체를 풀어주고 배열에 담습니다.

case3 indexOf() + filter()를 이용하기

indexOf는 해당하는 특정값이 처음으로 나오는 인덱스를 반환 없다면 -1을 반환, 해당값이 맞아 떨어지면 해당 첫번째 인덱스를 반환합니다.

const deplicate = e => {
  const arr = [...e];
  const unique = arr.filter((el, index) => {
    return arr.indexOf(el) === index; //indexOf를 사용하면 맞아떨어지는 "해당 첫번째 index를 반환"
  });
  return unique.join('');
};
deplicate('ksekkset'); //keset

case4 forEact + includes 이용하기

forEach() : 배열을 순회하기 위한 메서드로 콜백함수를 실행 includes() : 주어진 배열에 “특정 값이” 포함되는가의 여부를 검사 리턴값은 true/false로 반환됩니다.

const loopArr = [1, 1, 2, 3, 3, 4];
let uniArr = [];
loopArr.forEach(item => {
  if (!uniArr.includes(item)) {
    //uniArr에 "특정값이 포함되어 있지 않다면"
    uniArr.push(item); // 해당 배열에 값을 넣어준다.
  }
});

case5 오브젝트 이용하기

객체는 키-값 쌍으로 이루어진 요소를 가지는 객체입니다. “키는 중복될 수 없기 때문”에 이 특성을 이용해 “배열 요소를 키(Key)로 해서 맵에 데이터를 넣은 후”, 객체 메서드인 keys()를 이용해 키 값만을 배열로 가져오는 식으로 중복 없는 배열을 생성

const find = arr => {
  const copyArr = [...arr];
  const objUnique = {};
  copyArr.forEach(el => {
    objUnique[el] = true;
  });
  return Object.keys(objUnique).join('');
};
const result = find('ksekkset'); //keset

느낀점

해당 메서드들을 잘 안다고 생각했는데 막상 해당 메서드를 쓰려고 하니 미진한 부분들을 알았습니다. 특히 indexOf,includes 함수들은 이번 블로깅을 통해서 많이 습득이 되었습니다.

참고

hi.anna 블로그