如何实现数组去重?

105 阅读2分钟

如何实现数组去重?

方案一 通过indexof

let arr = [1, 3, 5, 7, 7, 1, 66]
let Arr = []
arr.forEach(item => {
  if (Arr.indexOf(item) === -1) {
    Arr.push(item)
  }
})
console.log(Arr); //打印结果  [1, 3, 5, 7, 66]

方案二 通过双重for循环

执行过程

双层for循环的执行过程
第一次外层 arr[i]==>88
内层执行 arr[j]==>3
内层执行 arr[j]==>5
内层执行 arr[j]==>7
内层执行 arr[j]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第二次外层 arr[i]==>3
内层执行 arr[j]==>5
内层执行 arr[j]==>7
内层执行 arr[j]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第三次外层 arr[i]==>5
内层执行 arr[j]==>7
内层执行 arr[j]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第四次外层 arr[i]==>7
内层执行 arr[j]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第五次外层 arr[i]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第六次外层 arr[i]==>3
内层执行 arr[j]==>66
————————————————————————
第七次外层 arr[i]==>66
内层执行:外层的最后一次i起始值为数组下标6,是数组的最后一个元素,内层j的起始值为6+1就是数组的下标为7的元素。 也就是说当前内层循环的j是7 而arr.length(数组长度)为6,那么7 < 6 吗? 所以条件不成立,最后一次内循环不执行,直接退出了循环。 ————————————————————————

let arr = [88, 3, 5, 7, 7, 3, 66]
for (let i = 0; i < arr.length; i++) {
  console.log(arr[i]);
  for (let j = i + 1; j < arr.length; j++) {
    console.log(arr[j]);
    // 判断条件   把重复的数删除
    if (arr[i] === arr[j]) {
      arr.splice(j, 1)
    }
  }
}

方案三 利用Set()+Array.from()

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。Set 中的元素只会出现一次,即 Set 中的元素是唯一的。
Array.from() 方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。

// 封装直接调用
function unique(arr) {
  return Array.from(new Set(arr))
}


let arr = [88, 3, 5, 7, 7, 3, 66]

let setMy = new Set()
arr.forEach(item => setMy.add(item))

console.log(setMy); Set(5);   //打印结果  { 88, 3, 5, 7, 66 }
console.log(Array.from(setMy)); //打印结果 [88, 3, 5, 7, 66]

方案四 利用数组的includes方法

includes()方法:用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false。

let arr = [88, 3, 5, 7, 7, 3, 66]

const Arr = []
arr.forEach(item => {
  // 判断
  console.log(!Arr.includes(item));
  if (!Arr.includes(item)) {
    Arr.push(item)
  }
})
console.log(Arr);  //打印结果:[88, 3, 5, 7, 66]

方案五 利用 filter和indexOf

let arr = [88, 3, 5, 7, 7, 3, 66]
let Arr = arr.filter(function (item, index, arr) {
  console.log(index);     //打印结果    0 1 2 3 4 5 6
  console.log(arr.indexOf(item, 0));  //打印结果     0 1 2 3 3 1 6
  return arr.indexOf(item, 0) === index
})
console.log(Arr);    //打印结果:[88, 3, 5, 7, 66]

总结:

这里分享了5种方案

  1. 方案一 通过indexof
  2. 方案二 通过双重for循环
  3. 方案三 利用Set()+Array.from()
  4. 方案四 利用数组的includes方法
  5. 方案五 利用 filter和indexOf

更推荐大家使用的是方案一和方案二,也是比较常用的哦