오늘 시간을 내어 JavaScript에서 일반적으로 사용되는 배열 알고리즘을 요약하여 서면 인터뷰나 일일 개발 프로세스에 사용할 수 있도록 하세요. 일부 알고리즘은 인터넷에서 제공되며 여기에 요약되어 있습니다. 기사 마지막에 참고자료 출처를 첨부하겠습니다. 알고리즘을 직접 보는 것이 지루하다면 참고문헌을 읽어보시면 설명이 아주 잘 나와 있습니다.
1. 어레이 중복 제거
방법 1:
//利用数组的indexOf方法 function unique (arr) { var result = []; for (var i = 0; i < arr.length; i++) { if (result.indexOf(arr[i]) == -1) result.push(arr[i]); } return result; }
방법 2:
//利用hash表,可能会出现字符串和数字一样的话出错,如var a = [1, 2, 3, 4, '3', 5],会返回[1, 2, 3, 4, 5] function unique (arr){ var hash = {},result = []; for(var i = 0; i < arr.length; i++) { if (!hash[arr[i]]) { hash[arr[i]] = true; result.push(arr[i]); } } return result; }
방법 3:
//정렬 후 인접한 항목을 비교하여 동일하면 포기하고, 그렇지 않으면 결과에 추가합니다. 방법 2와 같은 문제가 발생하게 되는데 배열에 1,1,'1' 같은 상황이 있으면 문제 해결이 됩니다
function unique (arr) { arr.sort(); var result=[arr[0]]; for(var i = 1; i < arr.length; i++){ if( arr[i] !== arr[i-1]) { result.push(arr[i]); } } return result; }
방법 4:
//最简单但是效率最低的算法,也不会出现方法2和方法3出现的bug function unique (arr) { if(arr.length == 0) return; var result = [arr[0]], isRepeate; for( var i = 0, j = arr.length; i < j; i++ ){ isRepeate = false; for( var k = 0, h = result.length; k < h; k++){ if(result[k] === arr[i]){ isRepeate = true; break; } if(k == h) break; } if( !isRepeate ) result.push(arr[i]); } return result; }
방법 5:
//此方法充分利用了递归和indexOf方法,感谢网友@真爱像深蓝 var unique = function (arr, newArr) { var num; if (-1 == arr.indexOf(num = arr.shift())) newArr.push(num); arr.length && unique(arr, newArr); }
2. 배열 순서 중단
방법 1:
//每次随机抽一个数并移动到新数组中 function shuffle(array) { var copy = [], n = array.length, i; // 如果还剩有元素则继续。。。 while (n) { // 随机抽取一个元素 i = Math.floor(Math.random() * array.length); // 如果这个元素之前没有被选中过。。 if (i in array) { copy.push(array[i]); delete array[i]; n--; } } return copy; };
방법 2:
//跟方法1类似,只不过通过splice来去掉原数组已选项 function shuffle(array) { var copy = [], n = array.length, i; // 如果还剩有元素。。 while (n) { // 随机选取一个元素 i = Math.floor(Math.random() * n--); // 移动到新数组中 copy.push(array.splice(i, 1)[0]); } return copy; }
방법 3:
//前面随机抽数依次跟末尾的数交换,后面依次前移,即:第一次前n个数随机抽一个跟第n个交换,第二次前n-1个数跟第n-1个交换,依次类推。 function shuffle(array) { var m = array.length, t, i; // 如果还剩有元素… while (m) { // 随机选取一个元素… i = Math.floor(Math.random() * m--); // 与当前元素进行交换 t = array[m]; array[m] = array[i]; array[i] = t; } return array; }
3. 배열 판단
방법 1:
//自带的isArray方法 var array6 = []; Array.isArray(array6 );//true
방법 2:
//利用instanceof运算符 var array5 = []; array5 instanceof Array;//true
방법 3:
//利用toString的返回值 function isArray(o) { return Object.prototype.toString.call(o) === '[object Array]'; }
4. 배열의 교점 찾기
방법 1:
//利用filter和数组自带的indexOf方法 array1.filter(function(n) { return array2.indexOf(n) != -1 });
5. 배열의 연합
방법 1:
//方法原理:连接两个数组并去重 function arrayUnique(array) { var a = array.concat(array2); for(var i=0; i<a.length; ++i) { for(var j=i+1; j<a.length; ++j) { if(a[i] === a[j]) a.splice(j--, 1); } } return a; };
6. 배열 차이 집합
방법 1:
//利用filter和indexOf方法 Array.prototype.diff = function(a) { return this.filter(function(i) { return a.indexOf(i) < 0; }); };
위의 방법 1은 한 배열과 다른 배열의 차이점만 찾을 수 있습니다. 예를 들어 array1.diff(array2)는 array1과 array2의 차이점만 찾을 수 있습니다. 두 개의 배열을 얻으려면 array1.diff(array2).concat(array2.diff(array1)) 또는 방법 2를 사용할 수 있습니다
방법 2
var array1 = new Array(55,55,88,6,68,109,55,33,6,2,1); var array2 = [55,88,99,69,109,55,33,6,2,1]; var diffArr = array1.concat(array2); var diff = diffArr.filter(function(i) { return array1.indexOf(i) < 0||array2.indexOf(i) < 0; }); console.log( diff );
지금은 요약한 것이며 추후 추가하겠습니다. 추가해주신 모든 분들을 환영합니다. 궁금한 점이 있으면 메시지를 남겨 함께 논의하고 진행해 보세요. ^_^