携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
前言:工作中经常会用到数组去重的场景,因此需要熟练的去掌握去重的方法,下面是一些方法来讲解如何数组去重。
1.两个for循环
缺点:对象和 NaN 不去重 注意: splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一 方法笨拙,如果数组长度很大,效率会很低
var num = [1, 2, 3, 4, 5, 6, 6, 6, 5];
for (let i = 0, len = num.length; i < len; i++) {
for (let j = i + 1; j < len; j++) {
if (num[i] == num[j]) {
num.splice(j, 1);
len--;
j--;
}
}
}
2.filter + indexOf
思路:利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等 注意: 对象不去重 ,NaN 会被忽略掉 indexOf 底层使用的是 === 进行判断,使用 indexOf 查找不到 NaN 元素 arr.indexOf(NaN); // -1
var num = [1, 2, 3, 4, 5, 6, 6, 6, 5];
num = num.filter((item, index) => {
return num.indexOf(item) == index;
});
3.for循环+indexof
let newArr = [1,2,4,5,6,6]
for (var i = 0, len = arr.length; i < len; i++) {
if (newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i])
}
}
4.sort()排序 + for循环
思路:利用sort方法用于从小到大排序,再判断相邻位置是否有相同的 注意:Set可以去重NaN类型,不去重对象
var num = [1, 2, 6, 4, 5, 6, 3, 6, 5];
num = num.sort();
var s=[];
for(let i=0,len=num.length;i<len;i++){
if(num[i]!=num[i+1]){
s.push(num[i])
}
}
5.Es6的... + new set()
注意:对象不去重 NaN 去重 思想: ES6 提供的数据结构 Set,它一个特性就是成员值都是唯一的,没有重复的值。
var num = [1, 2, 6, 4, 5,8, 6, 3, 6, 5,7,8,9];
num = [...new Set(num)];
6.利用Map去重
function duplicateRemoval(arr: any[]) {
let map = new Map()
let array = []
for (let i = 0; i < arr.length; i++) {
if (map.has(arr[i])) {
map.set(arr[i], true)
} else {
map.set(arr[i], false)
array.push(arr[i])
}
}
return array
}
let arr = [1, 2, 6, 4, 5, 8, 6, 3, 6, 5, 7, 8, 9]
duplicateRemoval(arr)
如果有错误或者不严谨的地方,请务必给予指正,十分感谢。