题解 | #数组去重#
数组去重
https://www.nowcoder.com/practice/7a26729a75ca4e5db49ea059b01305c9
数组去重的多种方法(参考了网上的解法,具体可以看这位大佬的JavaScript数组去重(12种方法,史上最全) - SegmentFault 思否)
一、利用自身的特性“不允许相同”来去重,对象的属性不能重复,ES6的Set或者 Map进行去重(Set这个方法有点短,面试应该不允许这样写吧?😥)
1. 用Set本身的"不容二虎"的特性先获取唯一的元素,接着用上ES6的新属性 “...” 扩展运算符创建新数组(或者用另一个方法 Array.from将某个类似数组或可迭代对象转为数组)。
return [...new Set(array)] 或者 return Array.from(new Set(array))
2. Map和Set一样具有元素唯一性,对于非对象类型,基础值基本能去重,可以用下文的splice原地去重(去重之后要记得更新map中的key-value键值对),也可以用创建新数组装不同元素返回结果
let map = new Map(); const res = []; // 数组用于返回结果 for (let i = 0; i < array.length; i++) { if(!map.has(array[i])) { // 如果map中不存在相同值,那么存入数组,否则什么也不干 res.push(array[i]) map.set(array[i],1) } } return res;3.对象属性不能重复,根据大佬的说法,这种方法不可靠,但是面试可以说思路?🤣 还是别说了,避免到时候中招给自己挖坑,一问到底,问到裤衩都不剩
二、双循环 + splice(或者双循环+新数组,新数组遇到新数就存,否则相同的数不存入), 遇到相同的元素则 splice删除 ,除了用splice还可以考虑其他能删除元素的方法(splice本身改变数组,slice不改变,slice额外开辟新空间😀给自己复习知识点,所以去重还是选择splice),核心是 双重循环找到相同元素并删除
//外层循环对每个数进行重复判断 for(let i=0; i<array.length; i++){ //内层循环对外层循环的下标 和内层循环下标的数进行相等判断 for(let j=i+1; j<array.length; j++){ //内层循环的数等于外层循环的数,那么删除外层循环的数 if(array[i]==array[j]){ array.splice(j,1); j--;//注意删除之后,当前数就没了,要改变下标 } } } return array
三、 filter去重 核心是 对每个元素进行过滤, 只取每个数第一次出现的位置
return arr.filter(function(item, index, array) { //filter总是获取每个数 indexOf() 后续还有其他相同的数都不管,这样就能达到不重复的目的 return array.indexOf(item, 0) === index; });