let oldArr = new Array();
oldArr = [1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 7, NaN, NaN];
// 1、最简单利用es6新语法set集合
function fnSet(arr) {
return [...new Set(arr)];
}
console.log("利用set去重:", fnSet(oldArr));
// 注意:可以对NaN,undefined去重,因为都可以储存在Set中
// 2、for循环逐一比较 splice
function fnFor(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--; //防止连续2个相同
}
}
}
return arr;
}
console.log("利用for循环去重:", fnFor(oldArr));
// 注意:无法NaN去重,因为js中NaN!==NaN
// 3、indexOf去重
// 原理:indexOf()方法:返回调用它对象第一次出现指定指的索引,未找到则返回 -1
function fnIndexOF(arr) {
const newarr = new Array();
arr.forEach((item) => {
if (newarr.indexOf(item) === -1) {
newarr.push(item);
}
});
return newarr;
}
console.log("利用indexOf去重:", fnIndexOF(oldArr));
// 4、数组的includes()方法,和indexOf异曲同工
function fnIncludes(arr) {
const newarr = new Array();
arr.forEach((item) => {
if (newarr.includes(item) === false) {
newarr.push(item);
}
});
return newarr;
}
console.log("利用fnIncludes去重:", fnIncludes(oldArr));
// 注意:为什么includes能够检测到数组中包含NaN,其涉及到includes底层的实现。在进行判断是否包含某元素时会调用sameValueZero方法进行比较,如果为NaN,则会使用isNaN()进行转化。
// 5、利用Map()
function fnMap(arr) {
const mymap = new Map();
const newArr = [];
arr.forEach((item) => {
if (!mymap.has(item)) {
// has()用于判断map是否包为item的属性值
mymap.set(item, true); // 使用set()将item设置到map中,并设置其属性值为true
newArr.push(item);
}
});
return newArr;
}
console.log("利用Map去重:", fnMap(oldArr));
// 注意:可以NaN去重,map内判断NaN为相等,其他用===比较
// 6、利用对象,属性名不可以重复
function fnObj(arr) {
const newArr = [];
const obj = {};
arr.forEach((item) => {
if (!obj[item]) {
newArr.push(item);
obj[item] = true;
}
});
return newArr;
}
console.log("利用对象去重:", fnObj(oldArr));
打印结果:
![](https://img-blog.csdnimg.cn/img_convert/d8629eb126eb348337e977497ba4dba9.png)