때때로 이런 종류의 요구 사항이 발생할 수 있으며, 배열에서 중복된 요소를 삭제하고 하나만 유지해야 합니다. 가장 먼저 떠오르는 것은 아마도 두 개의 for 루프를 사용하여 중복 요소를 비교하고 제거하는 것입니다.
방법 1:
for ( var i = 0; i for( var j = i 1; j if( this[i] === this [j] ){
j = i;
}
}
arr.push( this[i] );
}
return arr;
};
방법 1을 사용하고 많은 데이터가 발생하면 성능이 훨씬 나빠집니다. 그럼 아래의 방법을 계속해서 살펴보시기 바랍니다.
방법 2:
방법 2는 sort의 커스텀 콜백 함수를 사용하고, IE6/7/8에서는 지원하지 않는 indexOf도 사용합니다. 물론 indexOf는 직접 시뮬레이션할 수도 있지만 더 큰 문제는 IE6/7/8의 정렬 방식과 표준 브라우저의 차이가 있다는 점입니다. IE6/7/8에서 정렬 메소드를 사용하는 사용자 정의 콜백 함수에는 많은 트랩이 있습니다. 위의 사용자 정의 정렬 콜백 함수 코드는 IE6/7/8에서 "누락된 숫자" 오류를 직접 보고합니다. NaN인 경우 이 오류가 보고됩니다. 이론적으로 정렬 콜백 함수는 정수만 반환할 수 있기 때문입니다. 반환 값의 문제를 무시하더라도 결국 다른 문제는 없습니다. 방법 2는 IE6/7/8에서 작동하지 않습니다.
Fool's Wharf의 방법 3을 살펴보면 다음과 같은 코드가 있습니다.
방법 3은 임시 개체를 사용하여 배열 요소를 저장합니다. 중복된 배열 요소가 발견되면 무시됩니다. 그러나 다음과 같은 배열이 발생하는 경우:
위 배열에서 방법 3을 사용하면 1과 "1"이 중복된 요소로 잘못 간주되어 삭제되므로, 이 버그를 해결하기 위해 방법 3을 약간 수정했습니다.
방법 3의 수정된 버전:
for( ; i < len; i ){
result = this[i];
if( obj[result] !== result ){
arr.push( result );
obj[결과] = 결과;
}
}
반환 도착;
};
그러다가 Fool's Wharf 기사 끝에 있는 댓글을 읽었습니다. 이 방법은 Rekey에서 제공하는 방법과 동일하지만 이 방법에도 버그가 있습니다. 이러한 2B 배열을 만나면 재앙이 될 것입니다.
위 배열에 대해 방법 3의 수정된 버전을 사용하면 마지막 세 요소가 삭제되지 않습니다. 그러나 이러한 종류의 배열은 약간 극단적인 방법입니다. -이를 방지하려면 처리하십시오. 임시 개체를 사용하는 방법은 표준 브라우저의 정렬보다 약간 빠르며 각 브라우저의 정렬 방법 알고리즘도 달라야 합니다.