1.js 객체의 키가 중복되지 않는다는 원칙에 따라 배열의 중복을 제거하는 방법은 가장 일반적인 생각에 따르면 다음과 같습니다. 다음:
function independentArray(arr){
var obj={},temp=[];
for(var i=0;i
if(!obj[arr[i]]){
temp.push(arr[i]);
obj[arr[i]] =true;
}
}
return temp;
}
var testarr=[1 ,2,3,2];
console.log (distinctArray(testarr));//[1,2,3]
꽤 좋아 보이지만 다음과 같이 되면 상황:
var testarr1=[1,2 ,3,"2"];
console.log(distinctArray(testarr));// [1,2,3]
여전히 같은 결과입니다. 이는 우리가 원하는 것이 아닙니다. 결과는 [1,2,3,"2"]여야 합니다. 즉, 중복 제거 프로세스 중에 유형의 무결성이 보장되어야 합니다.
위 상황을 고려하여 위 방법을 개선하였습니다.
function independentArrayImprove(arr){
var obj={},temp=[];
for(var i=0;i
if(!obj[typeof (arr[i]) arr[i]]){
temp.push(arr[i]);
obj[typeof (arr[i]) arr[i]] =true;
}
}
return temp;
}
위 메소드는 객체에 키를 넣을 때 typeof 접두사를 추가하므로 효과를 살펴보겠습니다. .
var testarr1=[1,2,3,"2"];
console.log(distinctArray(testarr));// [1,2,3,"2"]
죄송합니다. 나쁜! 그럼 이 기능은 완전히 괜찮은 걸까요? 다른 상황을 살펴보겠습니다!
var testarr1=[1,2,3,"2",{a:1},{b:1}];
console.log(distinctArray(testarr));// [1,2, 3. "2",{a:1}]
이 결과가 나타났습니다. {b:1}이(가) 설명할 수 없이 삭제된 이유는 중복 제거 문제 중에 유용한 데이터가 실수로 삭제되면 매우 심각한 문제이기 때문입니다. 방법은 완벽하지 않으므로 계속해서 살펴보겠습니다.
2.1에서 우리의 주요 아이디어는 js 객체의 키가 반복되지 않는다는 개념을 사용하여 우리의 생각을 안내하는 것이었지만 결국 해결하지 못했습니다. 그러면 우리는 원하는 기능을 달성하기 위해 사고 방식을 바꾸는 것을 고려할 수 있습니다.
다음과 같이 슬라이스 및 스플라이스 방법을 사용하여 배열 중복 제거를 수행합니다.
function independentArray2(arr){
var temp=arr.slice(0);//배열을 temp에 복사
for(var i=0;ifor(j=i 1;jif(temp[j]==temp[i]){
temp.splice(j ,1 );//요소 삭제
j--;
}
}
}
return temp;
}
테스트:
var testarr1=[1,2,3,"2"];
console.log(distinctArray(testarr));//[1,2,3]
var testarr2=[1,2, 2, {a:1},{a:1},{a:1,b:2},function(){alert("b");},function(){alert("b");}] ;
//[1,2,{a:1},{a:1},{a:1,b:2},function(){alert("b");},function(){ 경고( "b");}]
테스트 결과가 여전히 우리의 요구 사항을 충족하지 못하는 경우 어떻게 해야 합니까? 위의 방법에 대한 우리 팀의 연구 결과, 두 개체의 동등성을 비교하는 작업에 주요 문제가 있음을 발견했습니다. 이 상황에서 우리는 또 다른 방법을 썼습니다:
function independentArrayAll(arr){
var isEqual=function(obj1,obj2){
//두 객체의 주소는 동일하며 동일해야 합니다
if(obj1===obj2){
true를 반환합니다.
}
if(typeof(obj1)==typeof(obj2)){
if(typeof(obj1)=="object"&&typeof(obj2)=="object"){
var pcount=0;
for(var p in obj1){
pcount ;
if(!isEqual(obj1[p],obj2[p])){
return false;
}
}
for(var p in obj2){
pcount--;
}
return pcount==0;
}else if(typeof(obj1) =="function"&&typeof(obj2)= ="function"){
if(obj1.toString()!=obj2.toString()){
return false;
}
}else {
if(obj1!=obj2 ){
false를 반환;
}
}
}else{
false를 반환;
}
true를 반환;
}
var temp=arr.slice(0);//temp에 배열 복사
for(var i=0;ifor(j=i 1 ;jif(isEqual(temp[j],temp[i])){
temp.splice(j,1);//요소 삭제
j --;
}
}
}
반품 온도;
}
테스트:
var testArr3=[1,2,2,{a:1},{a:1},{a:1,b:2},function(){alert("b") ;},function(){alert("b");}];
console.log(distinctArrayAll(testArr3));
//Results[1,2,{a:1},{a: 1,b:2},함수(){alert("b");}]
아, 드디어 중복 제거 작업을 성공적으로 완료했습니다. 각 방법의 성능 문제는 다음 논의로 남겨두겠습니다! 마지막 방법은 복잡한 배열을 중복 제거할 수 있는 범용 중복 제거 방법이지만 해당 실행 오버헤드도 상당히 크다는 것을 알 수 있습니다. 실제 프로젝트 개발에서는 때로는 순수 숫자나 순수 문자만 필요한 경우도 있습니다. 우리는 필요에 따라 해당 알고리즘을 유연하게 선택할 수 있습니다. 우리는 너무 완벽함을 추구하지 않고 요구 사항을 충족하는 데 기반하여 프로그램을 보다 효율적으로 만들기 위해 노력합니다.