常用的数组去重方法

数组的去重

一. 普通双循环去重

// 操作原数组
let array = [3, 1, 1, 1, '1', 7, 1, 3, 2, 5, 4, 3, 2, 5, 7, 8, 9, 8];
for(let i = 0, len = array.length; i<len; i++){
    for(let j = i+1, len = array.length; j<len; j++){
        if(array[i] === array[j]){
            array.splice(j,1);
            // 这一步非常重要,j向前走了一步,去重删除后,需要后退一步,保证去重不漏
            j--
        }
    }
}
console.log(array)   // [3, 1, "1", 7, 2, 5, 4, 8, 9]

// 定义一个新的数组,来接收去重后的数组
let newArr = [];
for(let i = 0, len = array.length; i<len; i++){
    // 这里的判断条件写法还有很多
    // newArr[i] !== array[i]
    // newArr.indexOf(array[i]) === -1
    if(!newArr.includes(array[i])){
        newArr.push(array[i])
    }
}
console.log(newArr)   // [3, 1, "1", 7, 2, 5, 4, 8, 9]

二.利用forEachmap,reduce去重

// forEach返回值是undefined
let newArr = [];
array.forEach(each => {
    if(!newArr.includes(each)){
        newArr.push(each)
    }
});
console.log(newArr)  // [3, 1, "1", 7, 2, 5, 4, 8, 9]

// map有返回值
let newArr = [];
array.forEach(each => {
    if(!newArr.includes(each)){
        newArr.push(each)
    }
});
console.log(newArr)  // [3, 1, "1", 7, 2, 5, 4, 8, 9]

// reduce,第二个参数是pre的初始值
array.reduce((pre,cur) => {
    if(!pre.includes(cur)){
        pre.push(cur)
    }
    // 可以自己打印看一哈pre的cur是啥子
    console.log(pre,cur)
    return pre
},[]);
console.log(pre)   // [3, 1, "1", 7, 2, 5, 4, 8, 9]

三.利用SetAarry.from/…扩展运算符去重(一句话)

// Set和Map类似,都是一组key的集合,但是Set不存储value。由于key不能重复,所以,可用于去重
let newArr = Array.from(new Set(array))
let newArr = [...new Set(array)];
console.log(newArr)   // [3, 1, "1", 7, 2, 5, 4, 8, 9]

四.自己封装去重方法

/**
* @param 
* 	arr  要去重的数组
*   option	 如果是对象类型的数组,那么option就是你指定的去重的关键字
* @return 
*   newArr,去重后的数组
*/
// ES6函数入参可传入默认值,不传值则直接取用默认值[]
function removeDuplicate (arr = [],option) {
    // 存储去重后的数据
    let newArr = [];
    // 用于存储唯一标志所对应的value
    let newArrKey = [];
    // Object.prototype.toString.call()是判断类型的方法,比typeof,instanceof判断靠谱
    if(Object.prototype.toString.call(arr) !== '[object Array]' ){
        alert('你需要传入一个数组参数')
        return
    } else {
        if (option){
            arr.map(each => {
                console.log(each)
                if(!newArrKey.includes(each[option])){
                    newArrKey.push(each[option])
                    newArr.push(each)
                }
            });
        } else newArr = Array.from(new Set(arr))
    }
    return newArr
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值