一个数组
let arr = [1,2,2,4,null,null,'3','abc',3,5,4,1,2,2,4,null,null,'3','abc',3,5,4];let len = arr.length;
一,利用对象key值的唯一性辅助筛选数组
let obj = {};for(let i =0; i<len; ++i){ let tmp = arr[i]; if(obj[tmp] !== undefined){ // 对象中存在,筛除掉 arr.splice(i,1); --i; continue; } obj[tmp] = tmp; // 存入对象中}
二,替换元素地位从而替换调 splice办法
第一种办法有个效率问题。splice实现删除性能不太好,以后项被删除后,随后每一项的索引都要向前挪动一位,数据量较宏大时,肯定会影响性能。
新思路:若以后元素反复,则与数组最初一位元素替换地位。i--再次进行判断即可,同时length--,操作数组的长度实现删除数组的最初一个元素,这样便不会影响到数组中其余元素。
let obj = {};for(let i =0; i<len;++i){ let tmp =arr[i]; if(obj[tmp] !== undefined){ arr[i] = arr[len-1]; --len; --i; continue; } obj[tmp] = tmp;}
三,filter和indexOf办法
filter() 不会对空数组进行检测。
filter() 不会扭转原始数组,属于纯函数。
返回 item 第一次呈现的地位等于以后的index的元素
let result = arr.filet((item,index)=>{ arr.indexOf(item) === index; // 遍历上来,找到的永远是第一次呈现的值,第一次呈现的值索引值等于index})
四,filter和Object.hasOwnProperty
hasOwnProperty() 办法:返回一个布尔值,示意对象本身属性中是否具备指定的属性
let obj = {};arr.filter(item=>obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item ] = true))
五,用sort办法对数组进行一次排序。之后比拟前后元素是否相等
function unique(arr) { if(!Array.isArray(arr)){ console.log("type error ,not a function") return } arr = arr.sort(); let result = arr[0]; for(let i = 1; i<arr.length;++i){ if(arr[i] !== arr[i-1]){ result.push(arr[i]) } } return result}
六,应用includes函数,外围代码就是在循环中进行includes判断result.includes(arr[i]);
把循环替换掉,能够用reducer来解决
arr.reduce((pre,cur)=>pre.includes(cur) ? pre : [...pre,cur],[])
成果也是一样的。