javascript系列之 数组去重 篇
本篇将介绍4种数组去重的方法,其他的基本都大同小异
1.利用Set、Map数据结构
利用Set、Map数据结构成员的值都是唯一的特点
//Set
function dedupe (arr) {
return [...new Set(arr)];
}
function dedupe (arr) {
return Array.from(new Set(arr));
}
//Map
function deeupe (arr) {
let map = new Map();
return arr.filter(function (ele) {
return !map.has(ele) && map.set(ele, 123)
//当map结构没有ele时,添加并返回true
})
}
2.利用arr.indexOf()
function dedupe (arr) {
let rslt = [];
arr.forEach(ele => {
if(rslt.indexOf(ele) == -1) {
rslt.push(ele)//没有则添加
}
});
return rslt;
}
function dedupe (arr) {
return arr.filter(function (ele, index) {
return arr.indexOf(ele) === index
//当arr中有重复的ele时,indexOf()总是返回第一个匹配到的index索引
//第一个ele的indexOf的索引等于遍历循环中的index
//而重复的值的indexOf的返回的索引值(为第一个ele索引值)总是小于本身的index
})
}
3.利用arr.sort()排序去重
arr.sort()排序后的数组相同的都会排在一起,这是可以跟前一个作比较是否一样来确认是否重复
function dedupe10 (arr) {
let rslt = [];
let previous;
let sortedArr = arr.slice().sort();
//先复制再排序,避免修改到原arr
sortedArr.forEach(function (ele) {
if(!rslt.length || ele !== previous) {
//如果是第一个元素或者相邻的元素不相同
//注意要用!==全等比较
rslt.push(ele)
previous = ele;
}
})
return rslt;
}
4.利用object的键值
object的键值不会重复,可以实现数组去重
//不能识别数字和字符串,如arr=[1, '1'],返回[1];
//对象无法识别,对象会被转为[object Object]
function dedupe(arr) {
let obj = {};
return arr.filter(function (ele) {
if(!obj.hasOwnProperty(ele)) {
obj[ele] = 123
return true;
}
return false
//可简化为return !obj.hasOwnProperty(ele) && (obj[ele] = 123)
})
}
//利用[typeof(ele)+ele]可识别数字和字符串
function dedupe8(arr) {
let obj = {};
return arr.filter(function (ele) {
return !obj.hasOwnProperty(typeof(ele) + ele) && (obj[typeof(ele) + ele] = 123)
})
}
//利用[typeof(ele)+JSON.stringify(ele)]可识别对象(内容不同)
function dedupe(arr) {
let obj = {};
return arr.filter(function (ele) {
log(typeof(ele) + JSON.stringify(ele));
return !obj.hasOwnProperty(typeof(ele) + JSON.stringify(ele)) && (obj[typeof(ele) + JSON.stringify(ele)] = 123)
})
}