js数组去重

let arr = [false,false,'uu盘','uu盘',2,2,undefined,undefined,null,null,NaN,NaN,{},{}]进行去重。

1. ES6-set

使用ES6中的set方法

let newArr = [...new Set(arr)]
console.log(newArr);   

只能对简单数据类型进行去重,引用数据不能去重
在这里插入图片描述

2. forEach + indexOf

let newArr = []
arr.forEach(item=>{
    if(newArr.indexOf(item) == -1) {
        newArr.push(item)
    }
})
console.log(newArr);

使用forEach+indexOf,不能对NaN进行去重,可以使用includes方法arr.indexOf(NaN) === -1
在这里插入图片描述

3. filter + indexOf

let newArr = arr.filter((val,index,item)=>{
    return item.indexOf(val) == index
})
console.log(newArr);

美中不足的是,还是不能对NaN去重
在这里插入图片描述

4. forEach + includes

let newArr = []
arr.forEach(item=>{
    if(!newArr.includes(item)) {
        newArr.push(item)
    }
})
console.log(newArr);

在这里插入图片描述

5. 使用Map数据结构去重

function unique(arr) {
    let map = new Map()
    let newArr = []
    arr.forEach((item,index)=>{
        if(map.has(item)) {     // 如果存在key值
            map.set(item,true)  
        } else {
            map.set(item,false)
            newArr.push(item)
        }
    })
    return newArr
}
console.log(unique(arr));

在这里插入图片描述

6. 终极版本

前面几种方法是不能对引用数据类型进行去重

function arr_unique(arr){
    var hash = {};
    return arr.filter((val)=>{
        return hash.hasOwnProperty( typeof val + JSON.stringify(val) ) ? false : hash[typeof val + JSON.stringify(val)] = true ;
    });
}
console.log(arr_unique(arr));

在这里插入图片描述

7. 根据对象的某个属性去重

// 数据:
  let list = [{
    id:'1',
    name:'one'
  },{
    id:'2',
    name:'tow',
  },{
    id:'3',
    name:'three'
  },{
    id:'1',
    name:'one'
  },{
    id:'2',
    name:'tow',
  },{
    id:'4',
    name:'three'
}]

function unique(arr,val) {
  const res = new Map();
  // 返回不存在这个属性
  return arr.filter(item => !res.has(item[val]) && res.set(item[val], 1))
}
console.log(unique(list,'id'));

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值