数组去重的诸多方法

72 阅读2分钟

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。如果不去掉使用其他方法(因为本来就不等);