面试题——4种数组去重的方法
数组去重或者其衍生作为笔试题或者机试题出现的几率也是很大的,写出的方法越多,则让面试官觉得你思维越开阔,那么成功的几率当然就大了。
废话不多说,下面来说说下面我整理的4中数组去重的方法
方法一: findInArr方法+select方法组合
findInArr : 查找一个数在当前数组中是否存在,存在返回true,找完所有没有找到,返回false,这个数就是我们要操作的那个数组
select :循环数组,并调用findInArr方法 查找当前arr[i]在arr2中是否存在,如果返回false 那么就把当前这个数 arr[i] ,push到新的数组 arr2中,最后return arr2
1 function findInArr(n ,arr){ 2 for (var i = 0; i < arr.length; i++) { 3 if (n == arr[i]) { 4 return true; 5 } 6 } 7 return false; 8 } 9 function select (arr){ 10 var arr2 = []; 11 for(var i = 0; i < arr.length; i++){ 12 if (!findInArr(arr[i],arr2)) { 13 arr2.push(arr[i]); 14 } 15 } 16 return arr2; 17 }
方法二 :利用json特性
创建一个空的json,通过对key的检索,---> !json[arr[i]],取反说明不存在
这样我们可以对其进行赋值,json[arr[i]] = true; 对于 赋什么值,随意,保证它的键值对就行
并且把当前这个数push 或者其他方式都行 ,总是添加到新数组 arr2中,最后return arr2
1 function select (arr){ 2 var json = {}; 3 var arr2 = []; 4 for (var i = 0; i < arr.length; i++) { 5 if (!json[arr[i]]) { 6 json[arr[i]] = true; 7 arr2.push(arr[i]) 8 } 9 } 10 return arr2; 11 }
方法三: 相邻数比较法,这个方法前提是先用sort 进行简单排序,不需要改进版的
经过sort排序之后,我们不论它排序是否正确,但是有一点我们能确定,那就是相同的一定被排到了一起
那么我们对排序之后的数组遍历,并且让当前的数和下一个数进行比较,如果相等那么用splice(i,1) 方法对其进行删除,这时候i的值需要 i--,避免它少比一次,最后return arr;
1 function select(arr){ 2 arr.sort(); 3 for (var i = 0; i < arr.length; i++) { 4 if (arr[i] == arr[i+1]) { 5 arr.splice(i,1) 6 i--; 7 } 8 } 9 return arr; 10 }
方法四:使用数组的indexOf方法 (IE8--不兼容)
通过判断arr2.indexOf(arr[i]) == -1 ,来确定新数组arr2中没有arr[i],并将其添加到数组arr2中,最终返回 arr2
1 function select (arr){ 2 var arr2 = []; 3 for( var i = 0; i < arr.length; i++){ 4 if (arr2.indexOf(arr[i]) == -1) { 5 arr2.push(arr[i]) 6 } 7 } 8 return arr2; 9 }
上述四中方法肯定存在的性能的差异,可以从速度上,所占内存等进行比较,我没有测过所以就不妄加定论。希望测过的朋友,能告知 。谢谢