1. 双循环遍历
const arr = [1, 4, 54, 6, 7, 6, 7, 87, 3, 6, 8, 6, 97, 0, 86, 5, 657, 4, 2, 3, 4, 5, 6];
// 使用label标签,在多个嵌套循环中指定break/continue跳出的是哪个循环
// 这里标签名为outer(随意),只要在结果数组中找到相同的数字,直接跳过外层循环的这一次的迭代,开启下一次迭代
let result = [];
outer: for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < result.length; j++) {
if (result[j] == arr[i]) {
continue outer;
}
}
result.push(arr[i]);
}
console.log(result);
2. 使用includes/indexOf方法检测
const arr = [1, 4, 54, 6, 7, 6, 7, 87, 3, 6, 8, 6, 97, 0, 86, 5, 657, 4, 2, 3, 4, 5, 6];
let result = [];
for (let i = 0; i < arr.length; i++) {
if (result.includes(arr[i])) {
continue;
}
result.push(arr[i]);
}
console.log(result);
for (let i = 0; i < arr.length; i++) {
if (result.indexOf(arr[i]) == -1) {
result.push(arr[i]);
}
}
3. set
set是一个无序的、没有重复值的数据集合,按照严格等于的方式进行去重
NaN不自等,但是这里在set中仍然认为是 相等 的而去重掉
const arr = [1, 4, 54, 6, 7, 6, 7, 87, 3, 6, 8, 6, 97, 0, 86, 5, 657, 4, 2, 3, 4, 5, 6];
const s = new Set(arr); // 得到的是set集合
console.log([...s]); // 因此通过展开运算符,再转化为数组结构
4. Map
function arrayNonRepeatfy(arr) {
let map = new Map();
let array = new Array(); // 数组用于返回结果
for (let i = 0; i < arr.length; i++) {
if (map.has(arr[i])) { // 如果有该key值
map.set(arr[i], true);
} else {
map.set(arr[i], false); // 如果没有该key值
array.push(arr[i]);
}
}
console.log(map);
return array;
}
5. reduce方法
const arr = [1, 4, 54, 6, 7, 6, 7, 87, 3, 6, 8, 6, 97, 0, 86, 5, 657, 4, 2, 3, 4, 5, 6];
// 该方法接收两个参数,第一个是一个回调函数,第二个是回调函数中的第一个参数的默认值,不写的话默认数组的第一个元素
// prev表示上一次迭代的返回值,cur表示当前正在遍历的数组元素
// 当遍历结束后,再把最后的返回值给返回出去
const result = arr.reduce(function (prev, cur) {
prev.indexOf(cur) == -1 && prev.push(cur); // 短路计算
return prev;
}, []);
console.log(result);
如果有多个NaN,想要去重则使用set和map。如果不去掉使用其他方法(因为本来就不等);