最近看了蛮多数组去重的方法,想做一个系统的归纳总结
ES5数组去重
-
简单去重
新建数组,遍历,用indexOf判断(IE8+),值不在新数组就push
// An highlighted block var a=[1,1,3,9,4,3,2,3,6,7,5,11] function uniq(array){ var temp = []; for (var i=0; i<array.length; i++) { if (temp.indexOf(array[i])=="-1"){ temp.push(array[i]); } } return temp; } console.log(uniq(a))
-
数组下标法
数组下标法
还是得调用“indexOf”性能跟方法1差不多,
实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,
那么表示第i项是重复的,忽略掉。否则存入结果数组。// An highlighted block function uniq3(array){ var result = []; for (var i=0; i<array.length; i++){ if (array.indexOf(array[i])== i){ result.push(array[i]); } } return result; } var a3 = [1,2,"2",4,9,"a","a",2,3,5,6,5]; console.log(uniq3(a3));
-
对象键值去重法
给出一个不同类型的数组
速度最快, 占空间最多(空间换时间)
该方法执行的速度比其他任何方法都快, 就是占用的内存大一些。
现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,
不是的话给对象新增该键并放入新数组。
注意点:判断是否为js对象键时,会自动对传入的键执行“toString()”,
不同的键可能会被误认为一样,例如n[val]-- n[1]、n[“1”];
解决上述问题还是得调用“indexOf”。// An highlighted block function uniq1(array){ var temp = {}; var result = []; var type = ''; var val; for (var i=0; i<array.length; i++) { val = array[i] type = typeof array[i]; if (!temp[val]){ temp[val] = [type]; //{1:[number,string]} result.push(val); }else if (temp[val].indexOf(type)=='-1'){ temp[val].push(type); result.push(val); } } return result; } var a1 = [1,2,"2",4,9,"a","a",2,3,5,6,5]; console.log(uniq1(a1));
-
排序后相邻去除法(破坏原数组)
给传入数组排序,排序后相同值相邻
然后遍历时,新数组只加入不与前一值重复的值// An highlighted block function uniq2(array){ array.sort(); var result = []; for (var i=0; i<array.length; i++){ if (array[i]!==array[i-1]){ //!== 不严格等于 result.push(array[i]); } } return result; } var a2 = [1,2,"2",4,9,"a","a",2,3,5,6,5]; console.log(uniq2(a2))
-
优化遍历法
获取没重复的最右一值放入新数组
推荐的方法
实现思路:获取没重复的最右一值放入新数组。
(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)// An highlighted block var a4 = [1,2,2,3,5,3,6,5]; function uniq4(array){ var result = []; for (var i =0; i<array.length; i++){ for (var j=i+1; j<array.length; j++){ if (array[i] === array[j]){ i++; j=i; } } result.push(array[i]); } return result; } console.log(uniq4(a4));
参考博客链接 – 白杨-M 博客园