前言
数组去重是道经典的前端考题,2013年笔面试的时候,碰到过至少3次,方法有多种。
基本思路
- 数组遍历,元素一一比较,遇到相同的数组元素时则删除后面出现的
- 数组遍历,元素一一比较,遇到相同的数组元素,跳过前面重复元素,不相同的放入新数组
- 取一个数组元素放入新数组,遍历余下数组元素,与新数组的元素一一比较,若不相同则放入新数组
- 遍历数组,取一个元素作为对象的属性,判断属性是否存在
具体实现
删除余下重复的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function uniqueArr1(arr){ var time = (new Date).getTime() for(var i=0; i<arr.length; i++){ for(var j=i+1; j<arr.length; j++){ if(arr[i] == arr[j]){ arr.splice(j, 1); j--; } } } console.info((new Date).getTime()-time) return arr.sort(function(a, b){ return a-b}); } |
若相同则跳出循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function uniqueArr2(arr){ var time = (new Date).getTime(); var newArr = [], num = arr.length, i, j; for(i=0; i<num; i++){ for(j=i+1; j<num; j++){ if(arr[i] === arr[j]){ j = false; break; } } if(j){ newArr.push(arr[i]); } } console.info((new Date).getTime()-time); return newArr.sort(function(a, b){ return a-b}); } |
双循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function uniqueArr3(arr){ var time = (new Date).getTime(); var newArr = [], num = arr.length, i, j; for(i=0; i<num; i++){ for(j=i+1; j<num; j++){ if(arr[i] === arr[j]){ j = ++i; } } newArr.push(arr[i]); } console.info((new Date).getTime() - time); return newArr.sort(function(a, b){ return a-b}); } |
保证新数组唯一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function uniqueArr4(arr){ var time = (new Date).getTime(); var newArr = []; for(var i=0; i<arr.length; i++){ var flag = true; for(var j=0; j<newArr.length; j++){ if(arr[i] === newArr[j]){ flag = false; break; } } if(flag){ newArr.push(arr[i]); } } console.info((new Date).getTime() - time); return newArr.sort(function(a, b){ return a-b}); } |
利用对象属性唯一的特性,效率最高
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function uniqueArr5(arr){ var time = (new Date).getTime(); var newArr = [], obj = {}, property; for(var i=0; (property=arr[i]) !== undefined; i++){ if(!obj[property]){ newArr.push(property); obj[property] = true; } } console.info((new Date).getTime() - time); return newArr.sort(function(a, b){ return a-b}); } |
测试方案
1 2 3 4 5 6 7 8 9 10 |
//生成新随机数组 function createArr(num){ var arr = []; for(var i=0; i<num; i++){ arr.push(parseInt(Math.random()*100)); } return arr; } // 执行 uniqueArr5(createArr(10000)); |
果断看不懂,抢个板凳
哈哈,我来抢沙发!
Mua
哈哈,我来抢沙发!
恭喜抢到
哈哈,我来抢沙发!
你这叫前排,哈哈 – –