본 포스팅은 JavaScript의 배열에서 중복값을 찾을 수 있는 몇 가지 방법을 소개합니다.
개요
어플리케이션을 개발하다보면 중복값을 찾아야하는 경우가 빈번하게 발생한다. 예를 들어, 통계를 내야하거나 건수를 구해야하거나 유일한 값이 배열에 두 개 이상 존재하는지 확인해야하는 경우가 있다.
그리고 배열에서 중복값을 찾는 방법은 다양하며, 다음과 같이 값만 추려내거나 값과 인덱스를 한 번에 추려낼 수 있다.
const array = [1, 1, 1, 2, 3, 4, 5, 5, 5];
// 값만 추려내는 경우
// [1, 5]
// 값과 인덱스를 한 번에 추려내는 경우
// [{value: 1, indexs: [0, 1, 2]}, {value: 5, index: [6, 7, 8]}]
본 포스팅은 JavaScript에서 배열의 중복값을 찾을 수 있는 몇 가지 방법과 중복값을 다양한 형태로 추려내는 방법을 소개한다.
방법 1. 이중 for문
가장 간단한 방법으로 이중 for문을 사용하여 배열의 중복값을 찾을 수 있다.
const array = [1, 1, 1, 2, 3, 4, 5, 5, 5];
const duplicates = [];
for (let i = 0; i < array.length; i++) {
for (let j = i + 1; j < array.length; j++) {
if(array[i] === array[j]) {
duplicates.push(array[i]);
}
}
}
console.log(duplicates);
// [1, 1, 1, 5, 5, 5]
위 예시는 배열에 중복값이 세 개 이상인 경우 중복값을 관리하는 배열 duplicates에 값이 여러 개 삽입된다는 단점이 있다.
다음 예시와 같이 중복값을 관리하는 배열 duplicates에 includes() 메서드를 사용하여 중복값이 존재하는지 체크하는 조건문을 추가한다.
const array = [1, 1, 1, 2, 3, 4, 5, 5, 5];
const duplicates = [];
for (let i = 0; i < array.length; i++) {
for (let j = i + 1; j < array.length; j++) {
if(array[i] === array[j] && !duplicates.includes(array[i])) {
duplicates.push(array[i]);
}
}
}
console.log(duplicates);
// [1, 5]
방법 2. filter() 메서드와 indexOf() 메서드
두번째 방법으로 배열의 filter() 메서드와 indexOf() 메서드를 활용할 수 있다.
const array = [1, 1, 1, 2, 3, 4, 5, 5, 5];
const duplicates = array.filter((value, index) => {
return array.indexOf(value) !== index;
});
console.log(duplicates);
// [1, 1, 5, 5]
filter() 메서드로 배열을 순회하면서 indexOf() 메서드로 중복값이 있는지 확인한다. indexOf() 메서드의 반환 결과와 현재 인덱스가 다른 경우 중복값이 있다는 것을 의미한다.
위 예시도 이중 for문의 처음 예시처럼 중복값을 여러 번 표시한다는 단점이 있다. 유일한 값을 관리하는 Set 객체를 사용하여 중복값을 한 번만 표시한다.
const array = [1, 1, 1, 2, 3, 4, 5, 5, 5];
const duplicates = array.filter((value, index) => {
return array.indexOf(value) !== index;
});
const uniqueDuplicates = [...new Set(duplicates)];
console.log(uniqueDuplicates);
// [1, 5]
방법 3. Set 객체
세번째 방법으로 Set 객체와 Set 객체에서 제공하는 add(), has() 메서드를 활용할 수 있다.
const array = [1, 1, 1, 2, 3, 4, 5, 5, 5];
const uniqueSet = new Set(); // 배열에서 유일한 요소를 저장
const duplicateSet = new Set(); // 배열에서 중복된 요소를 저장
for(const value of array) {
if(uniqueSet.has(value)) { // 유일한 요소가 존재하면 중복된 요소로 판단
duplicateSet.add(value);
} else {
uniqueSet.add(value);
}
}
const uniques = [...uniqueSet];
const duplicates = [...duplicateSet];
console.log(uniques);
// [1, 2, 3, 4, 5]
console.log(duplicates);
// [1, 5]
위 예시는 배열의 유일한 요소를 uniqueSet이라는 Set 객체에 저장하고 중복된 요소는 duplicateSet이라는 Set 객체에 저장한다. 배열을 순회하면서 요소가 uniqueSet에 존재하지 않으면 추가하고, 존재하면 중복되는 요소로 판단하여 duplicateSet에 추가한다.
방법 4. 중복값이랑 인덱스를 한 번에 추려내는 방법
다음은 배열에서 중복값이랑 인덱스를 한 번에 추려내는 방법이다.
const array = ['A', 'B', 'A', 'C', 'C'];
const duplicates = {};
const result = [];
// 중복값을 객체의 키로 설정하고 값에 인덱스를 값으로 설정한다.
for (let i = 0; i < array.length; i++) {
let item = array[i];
if (duplicates[item] === undefined) { // 중복값이 객체의 키에 존재하지 않으면 키로 설정한다.
duplicates[item] = [i];
} else { // 중복값이 있으면 인덱스를 추가한다.
duplicates[item].push(i);
}
}
console.log(duplicates);
// {A: [0, 2], B: [1], C: [3, 4]}
// 객체를 배열로 변환한다.
for (let key in duplicates) {
if (duplicates.hasOwnProperty(key) && duplicates[key].length > 1) {
result.push({
value: key, // 중복값
indexes: duplicates[key] // 중복값의 위치
});
}
}
console.log(result);
// [{ value: A, indexes: [0, 2] }, { value: "C", indexes: [3, 4] }]
위 예시는 배열의 요소가 동일한 타입이며, 기본 타입일 경우 정상적으로 동작한다. 다음과 같이 배열의 요소가 다른 타입으로 구성된 경우 원하지 않는 결과를 볼 수 있다.
const array = [[], false, 'A', 'C', '', 'false'];
const duplicates = {};
const result = [];
for (let i = 0; i < array.length; i++) {
let item = array[i];
if (duplicates[item] === undefined) {
duplicates[item] = [i];
} else {
duplicates[item].push(i);
}
}
console.log(duplicates);
// {
// : [0, 4],
// A: [2],
// C: [3],
// false: [1, 5]
// }
for (let key in duplicates) {
if (duplicates.hasOwnProperty(key) && duplicates[key].length > 1) {
result.push({
value: key,
indexes: duplicates[key]
});
}
}
console.log(result);
// [{value: "", indexes: [0, 4]}, {value: "false", indexes: [1, 5]}]
참고
- JavaScript How to Find Duplicates in Array (without Removing)
- Find all duplicates in an array in JavaScript
- JavaScript, how to find duplicates in an array
- Find duplicates in an array using javaScript
- How to find duplicates in an array using JavaScript