欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS数组去重的几种方式(面试常考题)

程序员文章站 2024-03-14 15:13:04
...

本文只会讲解去重的思路,而具体的循环方式、相近的函数方法每个人都可以有不同的选择

如果你对数组遍历方式还不太熟悉,可以参考我的另一篇文章:《JS数组遍历的方式总结》

1.利用Set数据格式不允许元素重复的特性

我个人认为这种方式目前最为简洁

let arr = [0, 0, 1, 10, 12, '12', 15]
let uniArr = [...new Set(arr)]
console.log(uniArr) //[0, 1, 10 ,12, '12', 15]

2.检测数组中是否存在某个元素的方式,例如indexOf()、lastIndexOf()、includes()

这种去重的主要思路就是新建一个数组,如果这个新数组没有此元素就添加进去,否则就不添加,此处只演示了indexOf()的方式

let arr = [0, 0, 1, 10, 12, '12', 15]
function uniArr(arr) {
  let newArr = []
  for(let item of arr) {
    if(newArr.indexOf(item) === -1) {
      newArr.push(item)
    }
  }
  return newArr
}
console.log(uniArr(arr)) //[0, 1, 10 ,12, '12', 15]

3.让数组中的每一个元素和其他元素相比较,如果相同则删除重复的元素

let arr = [0, 0, 1, 10, 12, '12', 15]
function uniArr(arr) {
  let ar = [...arr]
  for(let i = 0, len = ar.length; i < len; i++) {
    for(let j = i + 1; j < len; j++) {
      if(ar[i] === ar[j]) {
        ar.splice(j, 1)
      }
    }
  }
  return ar
}
console.log(uniArr(arr))

4.先使用sort()排序,然后前后相邻的元素进行比较,如果不同,则添加前元素

let arr = [10, 0, 1, 0, 12, '12', 15]
function uniArr(arr) {
  let ar = arr.sort()
  let newArr = []
  for(let i = 0, len = ar.length; i < len; i++) {
    if(ar[i] !== ar[i+1]) {
      newArr.push(ar[i])
    } 
  }
  return newArr
}
console.log(uniArr(arr))

5.利用indexOf()、lastIndexOf()本身的特性:只会返回找到的第一个元素的下标

此处使用了lastIndexOf()举例

let arr = [0, 0, 1, 10, 12, '12', 15]
function uniArr(arr) {
  return arr.filter((item, index) => {
    return arr.lastIndexOf(item) === index
  })
}
console.log(uniArr(arr))

6.使用reduce()函数

要使用这种方式去重必须先了解这个方法

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

arr 表示原数组;
total 表示上一次调用回调时的返回值,或者初始值 initialValue;
currentValue 表示当前正在处理的数组元素;
currentIndex 表示当前正在处理的数组元素的索引,若提供 initialValue 值,则索引为0,否则索引为1;
initialValue 表示初始值

let arr = [0, 0, 1, 10, 12, '12', 15]
function uniArr(arr) {
  let newArr = arr.reduce((pre, cur, index) => {
    if(!pre.includes(cur)) {
      pre.push(cur)
    }
    return pre
  }, [])
  return newArr
}
console.log(uniArr(arr))

不过此方式本质上还是使用了方法2,只不过使用了reduce的循环方式来实现

相关标签: 个人心得