记录数组去重的几种方法
1、双层循环去重
先定义原始数组第一个元素的数组,遍历原始数组,新数组与原始数组进行比较
如果不重复就添加到新数组中,最后返回新数组res
let arr = [0,2,3,4,4,0,2]; function unique1(ary) { let res = [ary[0]]; for(let i=0;i<ary.length;i++){ let flag = true; for(let j=0;j<res.length;j++){ if(arr[i] === res[j]){ flag = false; break; } } if(flag)res.push(arr[i]); } return res; } console.log(unique1(arr)); //[0, 2, 3, 4]
2、使用indexOf方法去重
indexOf()方法可返回某个指定的元素在数组中首次出现的位置
首先定义一个空数组res,然后调用indexOf方法对原来的数组进行遍历判断,
如果元素不在res中,则将其push进res中,最后将res返回即可获得去重的数组
let bosh = [1,2,3,3,2,1,1,2,3,4,5,6,7]; function unique2(a){ let temp = []; for(let i=0;i<a.length;i++){ //如果没有找到首次出现的位置代表这个数不重复 if(temp.indexOf(a[i]) === -1){ temp.push(a[i]); } } return temp; } console.log(unique2(bosh)); // [1, 2, 3, 4, 5, 6, 7]
3、相邻元素去重(排序后去重)
首先调用了数组的排序方法sort(),然后根据排序后的结果进行遍历及相邻元素对比
如果相等则跳过改元素,直到遍历结束
let adjoin = [64,5,4,2,4,5,2]; function unique3(arr){ arr = arr.sort(); let empt = []; for(let i=0;i<arr.length;i++){ if(arr[i] !== arr[i-1]){ empt.push(arr[i]); } } return empt; } console.log(unique3(adjoin)); //[2, 4, 5, 64]
4、利用对象属性去重
创建空对象,遍历数组,将数组中的值设为对象的属性,并给该属性赋初始值1,每出现一次,对应的属性值增加1
这样,属性值对应的就是该元素出现的次数
let sz = [6,20,0,20,9,6,0]; function unique4(arr){ let item = []; let obj = {}; for(let i=0;i<arr.length;i++){ if(!obj[arr[i]]){ item.push(arr[i]); obj[arr[i]] = 1; }else{ obj[arr[i]]++; } } return item; } console.log(unique4(sz)); //[6, 20, 0, 9]
5、利用indexOf + filter
利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等,如果不等则说明该元素是重复元素,然后把重复的元素过滤掉
let filt = [0,99,33,22,0,44,33]; function unique5(arr){ return Array.prototype.filter.call(arr,function(item,index){ return arr.indexOf(item) === index; }); } console.log(unique5(filt)); //[0, 99, 33, 22, 44]
6、使用es6中set与解构赋值去重
set的特性就是值是唯一的,不能重复
let es = [1,2,2,3,4,1,3,5]; function unique6(arr){ return [...new Set(arr)] } console.log(unique6(es)); //[1, 2, 3, 4, 5]
7、使用es6中set与Array.from去重
Array.from可以将类数组转为数组
let array = [0,3,0,5,0,6,5]; function unique7(arr){ return Array.from(new Set(arr)) } console.log(unique7(array)); //[0, 3, 5, 6]