数组去重的几种方法
2021-05-19 本文已影响0人
辰漪
第一种:使用filter()筛选函数搭配indexOf()进行数组去重
实现思路:filter遍历数组,需要有返回值,返回值是一个条件表达式,满足条件返回出去,最后会返回一个新数组。indexOf()会返回该值在数组中第一次出现的索引,当该值第一次出现的索引,和当前对应的索引不一致,说明之前出现过。
let arr = [1, 5, 6, 8, 5, 7, 3, 1, 2, 2, 2, 6, 7]
function notRepeat1(arr) {
let newArr = []
newArr = arr.filter((item, index, arr) => {
return arr.indexOf(item) === index
})
return newArr
}
console.log(notRepeat1(arr)) // [1, 5, 6, 8, 7, 3, 2]
第二种:双重for循环加数组的splice()方法实现去重
实现思路:拿到数组第一项,和数组后边的每一项进行比较,如果有相等的就删除这个元素。然后就是拿到第二项,和后边每一项比较,再删除,当循环结束,去重结束。注意:删除数组其中一项,遍历时循环索引要往前进1,不然会漏掉一个。
let arr = [1, 5, 6, 8, 5, 7, 3, 1, 2, 2, 2, 6, 7]
function notRepeat2(arr) {
let newArr = [...arr] // 不要动原数组
for (let i = 0; i < newArr.length; i++) {
for (let j = i + 1; j < newArr.length; j++) {
if (newArr[j] === newArr[i]) {
newArr.splice(j, 1)
j--
}
}
}
return newArr
}
console.log(notRepeat2(arr)) // [1, 5, 6, 8, 7, 3, 2]
第三种:利用forEach循环配合数组的push()方法进行追加
实现思路:使用forEach遍历传进来的数组,创建一个空数组,通过indexOf()判断这个空数组有没有这个值,也就是等不等于-1,等于-1说明里边没有该值,使用push()追加进去。
let arr = [1, 5, 6, 8, 5, 7, 3, 1, 2, 2, 2, 6, 7]
function notRepeat3(arr) {
let newArr = []
arr.forEach((item, index, arr) => {
if (newArr.indexOf(item) === -1) {
newArr.push(item)
}
})
return newArr
}
console.log(notRepeat3(arr)) // [1, 5, 6, 8, 7, 3, 2]
第四种:最简单,使用es6的set数据结构结合展开符,一行实现去重
实现思路:set数据结构里边的值不会有重复,使用new Set()会返回一个类数组,配合es6的展开符转化为真数组。
let arr = [1, 5, 6, 8, 5, 7, 3, 1, 2, 2, 2, 6, 7]
function notRepeat4(arr) {
let newArr = [...new Set(arr)]
return newArr
}
console.log(notRepeat4(arr)) // [1, 5, 6, 8, 7, 3, 2]
如果你们有其他方式去重,可以在评论区下方一起探讨一下哦