머리말
최근 이직하고 면접을 준비하기 위해 자바스크립트 관련 지식을 복습하기 시작했습니다. 어제 오후에 배열 중복 제거 관련 방법이 생각나서 간단하게 자바스크립트 알고리즘 기사 몇 개를 정리했습니다. 이 시리즈의 기사는 향후 사용이 불확실합니다. 횟수, 시간은 불확실합니다. 생각나는 대로 쓰겠습니다. 정확성도 보장되지 않으며 효율성도 보장되지 않습니다. 개인적인 이해에 대해서만 이야기하고, 실수가 있으면 정정해 주시기 바랍니다.
중복제거에 대하여
어레이 중복 제거는 일반적인 알고리즘 검사 지점이며 중복 제거를 달성하는 방법은 고유성과 비고유성을 통해서만 가능합니다. 간단히 말하면, 고유한 것을 골라내거나 고유하지 않은 것을 삭제하는 것을 의미합니다. 다음 알고리즘은 모두 제가 맹목적으로 명명한 것이므로 무시하시기 바랍니다.
중복 항목을 제거하기 위한 루프 매칭
이름에서 알 수 있듯이 배열의 각 요소는 요소를 저장하는 배열과 비교됩니다. 중복되지 않은 요소를 만나면 루프가 끝날 때까지 새 배열에 넣습니다. 중복을 제거하는 방법은 모두가 생각할 수 있는 가장 간단한 방법이기도 합니다.
구현 코드:
var arr=[1,3,4,56,3,7,9,7]; var result=[]; //匹配 function isMatch(array,n){ for(var i=0;i<array.length;i++){ if(array[i]==n){ return true; } } return false; }; //验证所有元素 function unqiue(array){ for(var i=0;i<array.length;i++){ if(!isMatch(result,array[i])){ result.push(array[i]); } } return result; }; console.log(unqiue(arr));
참고: 위 방법에는 숫자와 숫자열이 있을 때 숫자와 숫자열이 구분되지 않는 버그가 있습니다. 일치 함수 isMatch()에서는 이중 동등성 "=="를 사용하고 요소 유형을 확인하지 않으므로 실제로 합동인 "==="를 사용해야 합니다.
수정된 코드는 다음과 같습니다.
var arr=[1,3,4,56,3,'1',7,9,7]; var result=[]; //匹配 function isMatch(array,n){ for(var i=0;i<array.length;i++){ if(array[i]===n){ return true; } } return false; }; //验证所有元素 function unqiue(array){ for(var i=0;i<array.length;i++){ if(!isMatch(result,array[i])){ result.push(array[i]); } } return result; }; console.log(unqiue(arr));
알고리즘의 장점과 단점:
장점:
간단한 구현과 직관적인 사고
단점:
비효율성
JSON 중복제거/객체 중복제거/사전 중복제거
간단히 말하면 JSON 중복 제거는 객체 객체 키의 고유성을 사용하여 배열 요소를 JSON 또는 객체의 키 값으로 변환하는 것입니다. JSON의 값은 배열의 인덱스 인덱스를 저장한 다음 JSON 개체에 대해 for in 루프를 수행하여 새 배열에 저장합니다.
배열, JSON 및 {}는 모두 객체이므로 이 알고리즘은 어느 것을 사용해도 구현할 수 있습니다.
구현 코드:
배열 모드:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache=[]; var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
JSON 모드:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache={}; var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
개체 모드:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache=new Object(); var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
알고리즘의 장점과 단점:
장점:
간단
매우 효율적입니다
단점:
1. 배열 요소 유형 변경()
2. 버그가 있습니다(숫자와 숫자열을 구분하는 것 외에는 없습니다)
큐 재귀 중복 제거
어젯밤 저는 오랫동안 고민하다가 큐를 사용하는 아이디어를 생각해냈습니다. 먼저 배열을 오름차순 또는 내림차순으로 큐로 정렬하여 동일한 요소가 영역에 있도록 한 다음 일치시킵니다. 대기열 끝부터 일치에 성공하면 대기열 끝을 삭제하고 이전 요소가 이전 요소와 일치합니다. 전체 일치가 완료된 후 나머지 요소는 중복 제거 후 대기열입니다.
var arr=[6, 4, 6, 9, '6', 13, 56, 9, ,'11',1, 8, '7', 17, 5, 45, 3, 7]; function unqiue(array){ //排序数组,形成队列 array.sort(function(m,n){return m-n;}); ////排序后,队尾向前对比,如果相同,删除队尾,依次类推 function loop(Index){ if(Index>=1){ if(array[Index]===array[Index-1]){ arr.splice(Index,1); } loop(Index-1); } } loop(array.length-1); return array; } console.log(unqiue(arr));
알고리즘의 장점과 단점:
장점:
더 높은 효율성
단점:
가장 효율적이지 않음
INDEXOF 중복 제거 방법
브라우저가 indexOf를 지원하는지 확인합니다. indexOf는 ecmaScript5의 새로운 방법입니다. IE8 이하에서는 지원되지 않습니다(IE8 포함, IE8은 ecma5의 일부만 지원).
if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = -1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len = this.length; i < len; i++){ a_item = this[i]; if (a_item === item){ result = i; break; } } return result; } }