Recent Posts
Link
Archives
킹다의 개발블로그
배열에서 중복된 값이 있으면 중복된 값까지 제거하기 본문
반응형
중복된 값이 있으면 중복값까지 모두 제거
배열은 예시로 let arr = [54, 55, 60, 40, 50, 80, 60];
배열에 중복값이 있는지 확인하기 위해 중복 true, false를 반환하는 함수를 호출한다.
if(isDuplicate(arr)) {
rtnArr = isDuplicateIndex(arr);
arr = _.uniqBy(arr);
rtnArr = [...rtnArr,...arr];
const uniqueArr = rtnArr.filter((v, i)=> rtnArr.indexOf(v)===rtnArr.lastIndexOf(v));
arr = uniqueArr
}
배열에 중복값이 있는지 확인하는 함수
function isDuplicate(arr) {
const isDup = arr.some((x)=> {
return arr.indexOf(x) !== arr.lastIndexOf(x);
});
return isDup;
}
이 때, 만약 중복값이 있다면 true를 반환하고 아니면 false 를 반환한다.
arr 배열에는 중복값이 있기때문에 조건문 시작
if(isDuplicate(arr)) {
rtnArr = isDuplicateIndex(arr);
arr = _.uniqBy(arr);
rtnArr = [...rtnArr,...arr];
const uniqueArr = rtnArr.filter((v, i)=> rtnArr.indexOf(v)===rtnArr.lastIndexOf(v));
arr = uniqueArr
}
중복된 값의 인덱스값을 return 해주는 isDuplicateIndex() 함수 호출한다.
function isDuplicateIndex(arr) {
let rtnArr = [];
arr.forEach((x)=> {
if(arr.indexOf(x) !== arr.lastIndexOf(x)) {
rtnArr.push(arr.indexOf(x));
}
});
rtnArr = _.uniqBy(rtnArr);
return isDuplicateNumber(rtnArr, arr);
}
중복된 인덱스 값을 가지고 다시 중복된 값을 return해주는 함수를 호출한다.
function isDuplicateNumber(indexArr, arr) {
let rtnArr = [];
for(let i=0; i<arr.length; i++) {
indexArr.forEach((v)=> {
rtnArr.push(arr[v]);
})
}
return rtnArr = _.uniqBy(rtnArr);
}
이 함수에서는 기존의 배열과 중복된 인덱스값이 있는 배열을 가지고 기존 배열의 길이만큼 for문을 돌면서 중복된 인덱스 값 (60의 인덱스값 => 2, arr[2] = 60)을 찾아 rtnArr 배열에 넣어준다.
여기서 또한 중복값을 uniqBy를 사용해 중복값을 없애주고 return해준다.
return 된 값과 기존 arr 배열을 합친다.
const uniqueArr = rtnArr.filter((v, i)=> rtnArr.indexOf(v)===rtnArr.lastIndexOf(v));
rtnArr 배열을 filter를 사용해 같은 값이 아닌것만 return해주어 새로 담는다.
나중에 더 좋은방법이 있는지 생각해봐야겠다.
반응형
Comments