2011-11-29 3 views
4

입니다. 중복 요소를 반환하는 방법은 다음과 같습니다. 그러나 배열에 긴 텍스트가있는 항목이 많은 경우 브라우저 닫는 것과 같은 가장 위험한 성능 문제에 직면하고 있습니다.배열의 중복 요소를 반환하는 가장 좋은 방법은

var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7]; 
var sorted_arr = arr.sort(); 
var results = []; 
for (var i = 0; i < arr.length - 1; i++) { 
    if (sorted_arr[i + 1] == sorted_arr[i]) { 
    results.push(sorted_arr[i]); 
    } 
} 
alert(results); 

저에게이

+0

수 http://stackoverflow.com/questions/840781/easiest-way-to-find-duplicate-values-in-a-javascript-array –

+0

중복은 정수 배열 키 있습니까? 또한 실제 배열과 그 안에있는 항목은 얼마나 오래 있습니까? – hugomg

+2

@Saifuddin 이런 쓰레기도 같은 배열입니다.이것은 기술보다는 소비에 관한 질문이라고 믿게합니다. –

답변

5

정확히 원하는 것을 얻지는 못했지만 중복을 반환해야하는 경우 캐시 개체를 사용할 수 있습니다. 이것은 숫자 나 문자열 등으로 작동합니다.

var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7]; 
var cache = {}; 
var results = []; 
for (var i = 0, len = arr.length; i < len; i++) { 
    if(cache[arr[i]] === true){ 
     results.push(arr[i]); 
    }else{ 
     cache[arr[i]] = true; 
    } 

} 
console.log(results);//returns an array with 9 and 4 

은 물론 여러 항목 삭제 등 등 등

편집을 다른 일을 할 수있다 - 나는 니콜라의 솔루션은 당신을 위해 작동하지 않는 가정 how to remove duplicates from an array

1

귀하의 방법을 수행하는 가장 좋은 방법을 제안주세요 또는 공간/시간이 부족 하나의 이유가 될 수 없습니다 수 정렬에 의존한다.

중복을 제거하는 표준 방법은 키의 해시지도 (JS의 개체)를 유지하는 것입니다. 돌아 오는 객체 키가 반드시 원하는 순서대로 있지는 않습니다. 결과를 정렬 할 것인지를 지정하지는 않지만 지금은 결과를 정렬합니다.

더 이상 필요하지 않으므로 null 수 있습니다. 수집 될 때 JS 엔진까지입니다.

정렬 된 배열에 "현재 인덱스"를 유지하여 "적절한 위치에"중복을 제거 할 수 있으며 카운터 인덱스에서 중복되지 않은 요소를 "아래로"이동 한 후에 만 ​​증가시킨 다음 반환.

마지막 두 기술을 결합하면 일반적으로 유효한 참조가있는 단일 배열 만 사용할 수 있습니다.

편집 예. length을 명시 적으로 설정하면 .slice()은 새 배열을 만듭니다.

var have = {}; 
var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7]; 
arr = arr.sort(); 

for (var rIdx = 0, i = 0; i < arr.length; i++) { 
    if (have[arr[i]]) { 
     arr[rIdx++] = arr[i]; 
    } else { 
     have[arr[i]] = true; 
    } 
} 

arr.length = rIdx; 
console.log(arr); 
+0

더 많거나 적은 내가 쓴 것! :) –

+0

@NicolaPeluchetti 아닙니다. 당신은 여전히 ​​추가 배열을 가지고 있습니다. 어쨌든 당신이이기는 것처럼 보입니다.) –

+0

@ DᴀᴠᴇN example 예제 코드를 제공해 주시겠습니까? :-) – Exception

2

에 블로그 항목을 작성했습니다 (원래의 솔루션만큼 메모리를 많이 사용하기 때문에 입력에 요소 당 두 개의 요소가 저장되고 최악의 경우) 반복적으로 입력을 검색하는 느린 프로세스를 사용할 수 있습니다.

ECMAScript 5의 Array.indexOf 메서드가 필요합니다. 많은 브라우저에서 사용할 수 있습니다. 대안은 How do I check if an array includes an object in JavaScript?을 참조하십시오.

var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7]; 
var results = []; 
for (var i = 0, len = arr.length - 1; i < len; i++) { 
    if((results.indexOf(arr[i]) == -1) && (arr.indexOf(arr[i], i + 1) != -1)) { 
     results.push(arr[i]); 
    } 
} 
console.log(results); 

이 입력 arr 더한 출력 results보다 더 많은 메모리를 사용하지 않고 있지만, 그것은 O (N^2) 알고리즘이고 arr를 수정할 필요가 없다.

4

배열 필터가있는 경우 indexOf 및 lastIndexOf도 이며 정렬을 수행하지 않고 중복 된 값을 반환 할 수 있습니다.

var results, arr= [9, 9, 111, 2, 3, 4, 4, 5, 4, 7]; 

if(arr.filter){ 
    results= arr.filter(function(itm, i){ 
     return arr.lastIndexOf(itm)== i && arr.indexOf(itm)!= i; 
    }); 
} 

else// use your loop method 

alert(results) 

/* returned value: (Array) 
9,4 
*/ 
관련 문제