[javascript] Javascript에서 배열에 중복 값이 ​​있는지 어떻게 확인합니까?

중복 가능성 :
자바 스크립트 배열에서 중복 값을 찾는 가장 쉬운 방법

배열에 중복 된 값이 있는지 어떻게 확인합니까?

배열의 일부 요소가 동일하면 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicates exist

중복을 찾는 데 신경 쓰지 않고 배열에 중복이 포함되어 있는지 여부에 관계없이 부울 결과 만 원합니다.



답변

ES2015 환경 (이 글 작성 시점 : io.js, IE11, Chrome, Firefox, WebKit nightly)이있는 경우 다음이 작동하고 빠릅니다 (즉, O (n)).

function hasDuplicates(array) {
    return (new Set(array)).size !== array.length;
}

배열에 문자열 값만 필요한 경우 다음이 작동합니다.

function hasDuplicates(array) {
    var valuesSoFar = Object.create(null);
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (value in valuesSoFar) {
            return true;
        }
        valuesSoFar[value] = true;
    }
    return false;
}

우리는 valuesSoFar지금까지 배열에서 본 값이 키인 “해시 테이블”을 사용합니다 . in해당 값이 이미 발견되었는지 확인 하기 위해을 사용하여 조회합니다 . 그렇다면 우리는 루프에서 벗어나을 반환 true합니다.


문자열 값 이상으로 작동하는 함수가 필요한 경우 다음이 작동하지만 성능은 떨어집니다. O (n ) 대신 O (n 2 )입니다.

function hasDuplicates(array) {
    var valuesSoFar = [];
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (valuesSoFar.indexOf(value) !== -1) {
            return true;
        }
        valuesSoFar.push(value);
    }
    return false;
}

차이점은 valuesSoFar자바 스크립트 “해시 테이블”(즉, 객체)에는 문자열 키만 있기 때문에 해시 테이블 대신 배열을 사용한다는 것 입니다. 즉,의 O (1) 조회 시간을 잃고 in대신 O (n) 조회 시간을 얻습니다 indexOf.


답변

(또한 어레이 내의 객체 / 배열 요소들에 대한 또 다른 접근법 1 )이 될 수있는 2 :

function chkDuplicates(arr,justCheck){
  var len = arr.length, tmp = {}, arrtmp = arr.slice(), dupes = [];
  arrtmp.sort();
  while(len--){
   var val = arrtmp[len];
   if (/nul|nan|infini/i.test(String(val))){
     val = String(val);
    }
    if (tmp[JSON.stringify(val)]){
       if (justCheck) {return true;}
       dupes.push(val);
    }
    tmp[JSON.stringify(val)] = true;
  }
  return justCheck ? false : dupes.length ? dupes : null;
}
//usages
chkDuplicates([1,2,3,4,5],true);                           //=> false
chkDuplicates([1,2,3,4,5,9,10,5,1,2],true);                //=> true
chkDuplicates([{a:1,b:2},1,2,3,4,{a:1,b:2},[1,2,3]],true); //=> true
chkDuplicates([null,1,2,3,4,{a:1,b:2},NaN],true);          //=> false
chkDuplicates([1,2,3,4,5,1,2]);                            //=> [1,2]
chkDuplicates([1,2,3,4,5]);                                //=> null

또한보십시오…

1 에는 JSON을 지원하는 브라우저가 필요하거나그렇지 않은 경우 JSON 라이브러리 가 필요합니다.
2 편집 : 이제 함수를 사용하여 간단한 검사를하거나 중복 값의 배열을 반환 할 수 있습니다.


답변

글쎄, 나는 당신을 위해 인터넷에서 약간의 검색을했고이 편리한 링크를 찾았습니다.

JavaScript 배열에서 중복 값을 찾는 가장 쉬운 방법

위의 링크에 제공된 샘플 코드를 “swilliams”에 따라 솔루션에 적용 할 수 있습니다.


답변