题解 | #9种方法手撕数组去重,涵盖多种数据类型去重#
数组去重
https://www.nowcoder.com/practice/7a26729a75ca4e5db49ea059b01305c9
// 数组去重的多种方法
let arr = [
{},
{},
1,
2,
2,
"abc",
"abc",
true,
true,
false,
false,
undefined,
undefined,
NaN,
NaN,
];
// 1.set+点运算符
// Array.prototype.unique = function(){
// let arr1 = [...new Set(arr)];
// return arr1;
// }
// 2. set + Array.from方法(可浅拷贝一个可迭代对象)
// Array.prototype.unique = function(){
// let arr1 = Array.from(new Set(arr));
// return arr1;
// }
// 3. 声明一个空数组,用includes寻找如果没有该元素则加入新数组
// 以下三种写法均归为一种思路
// 写法一:includes方法:[includes底层使用sameValueZero()比较]
// Array.prototype.unique = function(){
// const newArray = [];
// arr.forEach(item=>{
// if(!newArray.includes(item)){
// newArray.push(item);
// }
// })
// return newArray;
// }
// 写法二:利用map的has和set方法(属性名不可重复)
// Array.prototype.unique = function(){
// const newArray = [];
// const map = new Map();
// arr.forEach(item=>{
// if(!map.has(item)){
// map.set(item,true);
// newArray.push(item);
// }
// })
// return newArray;
// }
// 写法三:利用对象属性名不可重复
// Array.prototype.unique = function(){
// const newArray = [];
// const obj = {};
// arr.forEach(item=>{
// if(!obj[item]){
// obj[item] = true;
// newArray.push(item);
// }
// })
// return newArray;
// }
// 4.利用reduce方法和includes
// Array.prototype.unique = function(){
// const newArray = arr.reduce((pre,cur)=>{
// if(pre.includes(cur) === false){
// pre.push(cur);
// }
// return pre;
// },[])
// return newArray;
// }
// 5.hasOwnProperty方法可以判断类型两个{},{}
// Array.prototype.unique = function(){
// const obj = {};
// const newArray = arr.filter(item=>{
// return obj.hasOwnProperty(typeof item + item) ? false : obj[typeof item +item] = true
// })
// typeof {}+{}为object[object Object],判断有没有空对象,已经有的话return false,没有就作为对象的属性加进去,值为true
// return newArray;
// }
// console.log(arr.unique());
// 下列方法无法判断NaN和NaN重复的情况
// 6.过滤器filter方法+indexof()方法,indexof会返回第一个找到的索引,如果当前数值之前出现过,
// 则indexof返回的索引恒为之前的那个数与当前数值的索引不一致,故可以去重
// Array.prototype.unique = function(){
// const newArray = arr.filter((item,index)=>{
// return arr.indexOf(item)===index;
// })
// return newArray;
// }
// 7.indexof
// Array.prototype.unique = function(){
// const newArray = [];
// arr.forEach(item=>{
// if(newArray.indexOf(item)===-1){
// newArray.push(item);
// }
// })
// return newArray;
// }
// 8.双循环+splice,比较相邻两个数如果重复用splice删除
// Array.prototype.unique = function(){
// let len = arr.length;
// for(let i=0;i<len-1;i++){
// for(let j=i+1;j<len;j++){
// if(arr[i]===arr[j]){
// arr.splice(j,1);
// len--;
// j--;
// }
// }
// }
// return arr;
// }
// 9.单循环+sort+splice
// Array.prototype.unique = function(){
// let len = arr.length;
// arr = arr.sort();
// for(let i=0;i<len-1;i++){
// if(arr[i]===arr[i+1]){
// arr.splice(i+1,1);
// len--;
// }
// }
// return arr;
// }
