总结一些日常需要用到的一些api,也是在一些面试中会经常出现的题目,今天分享的是数组去重的几个不同的方法, 同时文章也被收录到我的《JS基础》专栏中,欢迎大家点击收藏加关注。
给大家推荐一个实用面试题库
1、前端面试题库 (面试必备) 推荐:★★★★★
地址:前端面试题库
数组去重的方法
- set去重
- map去重
- for循环+indexof
- for循环+额外数组
- 双层for循环+splice
- filter+indexof
- map实现
Set去重
使用set自带的特性,利用set保存的元素都是不会重复,并且可以传入一个数组作为set的各个元素,set返回的是一个伪数组,可以通过reset的展开成多个元素,最后放到一个数组中,即可完成数组去重
var arr = [1,1,13,4,4,5,6,77,8,8,9] console.log([...new Set(arr)]) 复制代码
indexOf实现数组去重
indexof可以判断数组时候存在某个元素,indexof判断不存在某个元素的时候会返回 number类型的 -1 ,具体做法如下:
- 声明一个新数组
- 遍历旧数组,如果该元素不存在新数组中,则push进新数组
- 返回新数组
function uniqueArr(arr){ let res= [] for(let i = 0 ;i<arr.length;i++){ if(res.indexOf(arr[i]) === -1){ res.push(arr[i]) } } return res } console.log(uniqueArr(arr)) 复制代码
双层for循环+额外数组实现
判断条件是
j == result.length
判断每次循环的result数组是否全都遍历完,遍历完说明没有重复元素,使用push新增
let result = []; for (var i = 0; i < arr.length; i++) { for (var j = 0; j < result.length; j++) { if (arr[i] === result[j]) { break; } } if (j == result.length) { result.push(arr[i]); } } console.log(result) 复制代码
双层for循环+切割原数组实现
同样还是采用两个for循环,但与上面不同的是通过两个先后指针i、j来循环同一个数组,遇到相同的元素进行删除,然后j后退一位,因为删除一位的话,后面的元素会补上,所以j后退以为,以便循环的时候不会漏掉补位的元素
function unique(arr){ for(let i=0;i<arr.length;i++){ for(let j=i+1;j<arr.length;j++){ if(arr[i] === arr[j]){ arr.splice(j,1) j-- } } } return arr } 复制代码
filter+indexof数组去重实现
indexOf()
方法返回在数组中可以找到给定元素的第一个
索引,如果不存在,则返回 -1
这里利用了indexof会返回第一个元素的索引,那么通过filter,在元素重复的情况下,我们只需要保留相同的第一个元素即可,也就是说第二次出现的元素,indexof返回的是第一个出现元素的下标,通过筛选这个条件,就能过滤掉第二次出现的元素
let unique= (arr) => { return arr.filter((item,index) => { return arr.indexOf(item) ===index; }) }; 复制代码
map实现
最后一个map的实现算是比较简单的,map同样会对重复的元素进行过滤,最后map.keys进行结构然后返回到一个数组中
function unique(arr) { let map = new Map() for(let item of arr){ map.set(item,true) } return [...map.keys()] }
给大家推荐一个实用面试题库
1、前端面试题库 (面试必备) 推荐:★★★★★
地址:前端面试题库