本文介绍了八点数组去重方法。
一、利用ES6 Set去重(ES6中最常用)
// 方法一:
function unique(arr) {
return Array.from([...new Set(arr)]);
}
// 方法二:
function unique(arr) {
return [...new Set(arr)]
}
var arr = [
'true', 'true',
true, true,
undefined, undefined,
null, null,
NaN, NaN,
0, 0,
'a', 'a',
{}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, 0, "a", {}, {}]
二、利用Map数据结构去重
// 方法一:
function unique(arr) {
const newArray = [];
const tmp = new Map();
for(let i = 0; i < arr.length; i++) {
if (!tmp.has(arr[i])) {
tmp.set(arr[i], 1)
newArray.push(arr[i])
}
}
return newArray;
}
// 方法二:
function unique(arr) {
const tmp = new Map();
return arr.filter(item => !tmp.has(item) && tmp.set(item, 1));
}
var arr = [
'true', 'true',
true, true,
undefined, undefined,
null, null,
NaN, NaN,
0, 0,
'a', 'a',
{}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, 0, "a", {}, {}]
// {}没有去重
三、利用for嵌套for,然后splice去重(ES5中最常用)
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;
}
var arr = [
'true', 'true',
true, true,
undefined, undefined,
null, null,
NaN, NaN,
0, 0,
'a', 'a',
{}, {}
];
console.log(unique(arr));
// ["true", true, undefined, NaN, NaN, 0, "a", {}, {}]
// NaN和{}没有去重,因为null和undefined相同,null被删掉了
四、利用indexOf去重
function unique(arr) {
const resArr = [];
for (let i = 0; i < arr.length; i++) {
if (resArr.indexOf(arr[i]) === -1) {
resArr.push(arr[i])
}
}
return resArr;
}
var arr = [
'true', 'true',
true, true,
undefined, undefined,
null, null,
NaN, NaN,
0, 0,
'a', 'a',
{}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, NaN, 0, "a", {}, {}]
// NaN、{}没有去重
五、利用sort
function unique(arr) {
let newArr = arr.sort();
let array = [newArr[0]];
for (let i = 1; i < newArr.length; i++) {
if (newArr[i] !== newArr[i-1]) {
array.push(newArr[i]);
}
}
return array;
}
var arr = [
'true', 'true',
true, true,
undefined, undefined,
null, null,
NaN, NaN,
0, 0,
'a', 'a',
{}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, NaN, 0, "a", {}, {}]
// NaN、{}没有去重
六、利用对象属性唯一性
function unique(arr) {
let array = [];
let obj = {};
for (let i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) { // 无法过滤掉arr[i]为true
arrry.push(arr[i]);
obj[arr[i]] = 1;
} else {
obj[arr[i]]++;
}
}
return array;
}
var arr = [
'true', 'true',
true, true,
undefined, undefined,
null, null,
NaN, NaN,
0, 0,
'a', 'a',
{}, {}
];
console.log(unique(arr));
// ["true", undefined, null, NaN, NaN, 0, "a", {}, {}]
// 两个true直接去掉了, NaN、{}没有去重
七、利用includes
function unique(arr) {
const array = [];
for(var i = 0; i < arr.length; i++) {
//includes 检测数组是否有某个值
if(!array.includes(arr[i])) {
array.push(arr[i]);
}
}
return array;
}
var arr = [
'true', 'true',
true, true,
undefined, undefined,
null, null,
NaN, NaN,
0, 0,
'a', 'a',
{}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, 0, "a", {}, {}]
// {}没有去重
八、利用reduce+includes
function unique(arr){
return arr.reduce((prev,cur) => prev.includes(cur)
? prev : [...prev,cur], []);
}
var arr = [
'true', 'true',
true, true,
undefined, undefined,
null, null,
NaN, NaN,
0, 0,
'a', 'a',
{}, {}
];
console.log(unique(arr));
// ["true", true, undefined, null, NaN, 0, "a", {}, {}]
// {}没有去重
总结
本文介绍了set,map,结合数组方法indexOf,includes,filter,sort等方法,以及双重for循环和对象属性的唯一性等特性来进行数组去重。相比之下,Set和Map数据结构处理去重性能比较好。