一个数组
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],[])
成果也是一样的。