킹다의 개발블로그

배열에서 중복된 값이 있으면 중복된 값까지 제거하기 본문

01. 프로그래밍 언어/JavaScript

배열에서 중복된 값이 있으면 중복된 값까지 제거하기

킹다킹 2022. 5. 4. 17:31
반응형

중복된 값이 있으면 중복값까지 모두 제거

배열은 예시로 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