js实现数组与对象数组的去重

本文介绍了多种在JavaScript中去除数组重复元素的方法,包括filter、双重for循环、sort、for...of、includes()以及Set的使用。此外,还详细讲解了如何针对数组对象进行去重,分别展示了使用filter+Map、reduce和for循环的实现方式。这些方法覆盖了基本类型和复杂对象类型的数组去重场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组实现去重的方法

filter + indexOf进行去重

function deDeplicated(arr) {
    return arr.filter((item, index) => {
        console.log(index, arr.indexOf(item), index === arr.indexOf(item))
        return index === arr.indexOf(item);
    })
}

双重for循环进行去重

function distinctDoubleFor(arr) {
    // 第一层遍历
    for (let i = 0, len = arr.length; i < len; i++) {
        // 第二层遍历去查找第一层遍历的数是否在第二层遍历中找到相同的,相同则数组元素重复,删除
        for (let j = i + 1; j < len; j++) {
            if (arr[i] === arr[j]) {
                arr.splice(j, 1)
                len--
                j--
            }
        }
    }
    return arr
}

使用sort排序之后,判断左右是否相等,如果相等则说明为重复项

function distinctSort(arr) {
    // 从小到大排序
    arr.sort((a, b) => a - b)
    let arrRes = [arr[0]]
    for (let i = 1,len = arr.length; i < len; i++) {
        arr[i] != arr[i-1] && arrRes.push(arr[i])
    }
    return arrRes
}

使用for of + includes()

function distinctInclude(arr) {
    let result = []
    for (let i of arr) {
        // 判断当包含此项,则不会再进行push,不包含此项为true,则会执行 && 符后面的语句
        !result.includes(i) && result.push(i)
    }
    return result
}

使用Es6-Set进行去重

function distinctSet(arr) {
    let arrSet = new Set(arr)
    return [...arrSet]
}

数组对象实现去重的方法

使用filter和Map进行数组对象去重

function distinctObjectMap(arr, uniId) {
    const res = new Map();
    // 使用map记录下每个item的id,已存在的id将不会被筛选入内
    return arr.filter((item) => !res.has(item[uniId]) && res.set(item[uniId], 1));
}

使用reduce进行数组对象去重

function distinctReduce(arr, uniId) {
    let hash = {}
    return arr.reduce((accum, item) => {
        // 判断当前hash对象中是否存在此id,不存在此id则设置为true,并push进对象数组
        hash[item[uniId]] ? '' : hash[item[uniId]] = true && accum.push(item)
        return accum
    }, [])
}

使用for循环进行数组对象去重

function distinctFor(arr, uniId) {
    let obj = {}
    let tempArr = []
    for (let i = 0; i < arr.length; i++) {
        //判断当前id是否添加进数组
        if (!obj[arr[i][uniId]]) {
            tempArr.push(arr[i])
            // 记录当前id已被添加进数组
            obj[arr[i][uniId]] = true
        }
    }
    return obj
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值