一个数组

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],[])

成果也是一样的。