一丶filter()+ indexOf( ) 去重
-
思路:主要是利用filter()方法过滤掉重复的元素
function unique(arr) { //过滤掉原数组中重复的数字,返回新的数组 return arr.filter((item, index)=> { //遍历出数组中数字第一次出现的下标,与数字所在 数组的下标相比较, //为true就是第一次出现 return arr.indexOf(item) === index }) } let arr =[1,5,2,3,4,2,3,1,3,4] console.log(unique(arr)) //打印的是 [1, 5, 2, 3, 4]
二丶push() + indexOf()实现去重
-
思路:主要是利用indexOf()方法判断传入的数组值的是否在新数组存在,不存在就把传值push到新数组
function unique(arr){ //新建一个空数组 let newArr = []; for(var i = 0; i < arr.length; i++ ){ //遍历传入的数组,查找传入数组的值是否存在新数组中 if(newArr.indexOf(arr[i]) === -1){ //不存在就把值push到新数组 newArr.push(arr[i]); } } //返回新的数组 return newArr; } let a = [1,5,2,3,4,2,3,1,3,4]; console.log(unique(a)); /打印的是 [1, 5, 2, 3, 4]
三丶双重for循环 + splice() 或 双重for循环 + push()实现去重
-
思路:利用双重for循环找出重复的元素,然后在使用splice()方法删除重复的一个
function unique(arr) { //遍历数组中所有的元素 for(var i = 0,len = arr.length; i < len; i++){ for(var v = i + 1; v < len; v++){ //检查是否有重复的元素 if(arr[i] === arr[v]){ //有,就从数组中去除 arr.splice(v,1); // splice方法会改变数组长度,所以要将数组长度 len 和下标 v 减一 len--; v--; } } } return arr } let a = [1,5,2,3,4,2,3,1,3,4]; console.log(unique(a)); //打印 [1, 5, 2, 3, 4] 此方法特别浪费性能
四丶Set实现数组去重
- ES6 提供了新的数据结构 Set
- 它类似于数组,但是成员的值都是唯一的,没有重复的值(set本身是一个构造函数,用来生成 Set 数据结构)
第一种数组去重方法(使用Array.from):
let arr = [1,5,2,3,4,2,3,1,3,4];
let item = new Set(arr);
console.log(item);//结果输出的是一个对象
//打印的是 [1, 5, 2, 3, 4]
//使用Array.from转成数组
let arr = [1,5,2,3,4,2,3,1,3,4];
let item = Array.from(new Set(arr));
console.log(item);
//打印的是 [1, 5, 2, 3, 4]
第二种数组去重方法(使用...扩展运算符):
let arr = [1,5,2,3,4,2,3,1,3,4];
let item = [...new Set(arr)];
console.log(item);//[1, 5, 2, 3, 4]
- 优点:set集合去重是比较方便的,不需要自己再编写算法比对
- 缺点:不兼容个别浏览器