归纳的多种js数组去重复的方法,包括五种基本方法和ES6的三种简洁的方法。
1. 新数组法
思路: 判断数组每项值,值不在新数组就push进新数组
1 2 3 4 5 6 7 8 9
| var ary = [1,2,3,3,2,3,4,5]; var newary = []; for(var i = 0; i < ary.length; i++){ if(newary.indexOf(ary[i]) == -1){ newary.push(ary[i]); } } alert(newary);
|
2. 数组下表判断法
思路:类似第一种,判断值在数组中的索引,索引和i不相等就push进新数组
1 2 3 4 5 6 7 8 9
| var ary = [1,2,3,3,2,3,4,5]; var newarr = []; for(var i = 0; i < ary.length; i++){ if(ary.indexOf(ary[i]) == i){ newarr.push(ary[i]); } } alert(newarr);
|
3. 对象键值对法
思路:可以记录次数的对象去重,判断当前数组值作为对象的key是否存在值, 存在即把对象的值+1,否则值置为1,对象的key为数组的值,value为次数;此方法利用了object键的唯一性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var ary = [1,2,3,3,2,3,4,5]; var obj = {}; for(var i = 0; i < ary.length; i++){ var curvalue = ary[i]; if(obj[curvalue]){ obj[curvalue]++; }else{ obj[curvalue] = 1; } } var ary=[]; for(var attr in obj){ ary.push(attr); } alert(ary);
|
变式:
1 2 3 4 5 6 7 8 9 10 11
| var obj = {}, newarr = [], val, type; for (var i = 0; i < array.length; i++) { val = array[i]; type = typeof val; if (!obj[val]) { obj[val] = type; newarr.push(val); } } alert(newarr);
|
4. 排序后相邻元素对比
思路:利用sort()方法先对数组进行排序后,相邻元素对比不同push到新数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| var array = [3,6,3,9,7,5,9,12]; array.sort(function(x,y){ if(x < y){ return -1; }else if(x>y){ return 1 } return 0; }); var prevarr = [array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== prevarr[prevarr.length-1]){ prevarr.push(array[i]); } } alert(prevarr);
|
5. 优化遍历法
思路:利用双重循环,遇到重复元素跳出外层循环,进入下一次外层循环 这样就避免了重复元素的追加。有种冒泡排序的感觉0.0。
1 2 3 4 5 6 7 8 9 10 11
| var array = [12,252,32,32,22,12,45,50]; var r = []; for(var i = 0, l = array.length; i < l; i++) { for(var j = i + 1; j < l; j++) if (array[i] === array[j]){ j = ++i; } r.push(array[i]); } alert(r);
|
6. 利用ES6新特性的三种方法
思路:利用ES6中的Set数据结构,…扩展运算符,Array.from()数组转化的方法。
1. Set构造函数加…扩展运算符
1 2 3 4 5 6
| const set = new Set([1,5,3,4,5,1,1,0]);
var unique = [...set];
alert(unique);
|
2. 函数传值加数组序列化方法
1 2 3 4 5 6 7 8 9
| function unique(array){
return Array.from(new Set(array)); }
unique([1,5,3,4,5,1,1,0]);
alert(unique);
|
3. 类似第一种的转化
1 2 3 4 5 6
| let arr = [1,5,3,4,5,1,1,0];
var unique = [...new Set(arr)];
alert(unique);
|
暂且归纳这么多,不足之处还请不吝赐教!