项目中推荐使用一些开源库中的方法,例如我一般会使用lodash库的_uniq(array)
方法进行处理。
但在面试中免不了会这种基础的笔试题,现在来总结一下数组去重的方法:
- ES6的Set方法去重
[…new Set(arr)]
const arr= [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
Array.from(new Set(arr));
//或者
[...new Set(arr)]
该方法代码数量最少;但是从控制台输出也可以看出这种方法还无法去掉“{}”空对象
- indexOf
function unique (arr) {
let resArr=[];
arr.forEach(item => {
if(resArr.indexOf(item) === -1) {
resArr.push(item)
}
})
}
NaN和{}没有去重
3. sort()排序
function unique (arr) {
let resArr = [];
arr= arr.sort();
for(let i =0; i<arr.length; i++) {
if(arr[i]!==arr[i-1]) resArr.push(arr[i])
}
}
NaN和{}没有去重
- 利用对象的属性不能相同的特点进行去重
function unique (arr) {
let resArr=[];
let obj={};
for(let i=0; i<arr.length; i++) {
if(!obj[arr[i]]) {
obj[arr[i]]=1;
resArr.push(arr[i])
} else {
obj[arr[i]]++
}
}
}
两个布尔类型的true都被干掉了
- 双重for循环+splice去重
function unique (arr) {
for(let i=0; i<arr.length; i++) {
for(let j=i+1; j<arr.length; j++) {
if(arr[i] == arr[j]){ // ==等于或者===全等于
arr.splice(j,1);
j--;
}
}
}
return arr
}
全等于===
结果:
等于 ==
结果:
该方法的弊端也是显而易见:NaN和{}没有去重,null都被干掉了
- includes
function unique (arr) {
let resArr=[];
for(let i=0; i<arr.length; i++) {
if(!resArr.includes(arr[i])) resArr.push(arr[i])
}
}
{}没有去重
7. hasOwnProperty
function unique(arr) {
let obj={};
return arr.forEach(item=> {
return obj.hasOwnProperty(typeof item + item)?false : (obj[typeof item + item] = true)
})
}
该方法是最完美的去重方法
- filter
function unique (arr) {
return arr.filter((item, index) => {
//当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
arr.indexOf(item, 0)===index;
}
})
}
该方法把NaN丢了,空数组没有过滤掉
9. Map数据结构
function unique(arr) {
let resArr = [];
let arrMap = new Map();
for(let i=0; i<arr.length; i++) {
if(arrMap.has(arr[i])) {
arrMap.set(arr[i], true);
} else {
arrMap.set(arr[i], false);
resArr.push(arr[i])
}
}
return arr;
}
空数组没有去重
九种方法,应付面试足够了。哦吼~