数组去重的几种方法

辰漪
2021-11-09 / 0 评论 / 64 阅读 / 正在检测是否收录...

第一种:使用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]

如果你们有其他方式去重,可以在评论区下方一起探讨一下哦

1
选择打赏方式:
微信

评论 (0)

取消