JavaScript数组去重

一、IndexOf

IndexOf是数组的一个原生方法,当你传入一个参数的时候,它会返回入参数的索引值。如果未找到就返回 -1。

		let arr = [1,2,3,1,2,3];
        let newArr=[];
        for(let i=0;i<arr.length;i++){
            if(newArr.indexOf(arr[i])==-1){
                newArr.push(arr[i])
            }
        }
        console.log(newArr)

indexOf需要把每个参数重新判断一遍,效率很低下,而且indexOf还不能查到NaN的索引值

二、排序后去重sort()

		let arr = [1,2,3,1,2,3];
        let newArr = Array.from(arr).sort(); //创建一个新的数组对象
        let res = [newArr[0]]
        for(let i=1;i<newArr.length;i++){
            if(newArr[i] != newArr[i-1]){
                res.push(newArr[i])
            }
        }
        console.log(res)
  1. 我们先对数组进行排序,但在不影响原数组的前提下我使用了from来创建新数组
  2. 数组排好序之后,进行相邻比较
  3. res = [sortArr[0]] 和 i = 1 是个初始化操作

这样的做法,省去了对重复参数的索引。效率上面确实也提升不少。

三、利用双层循环

		let arr = [1,2,3,1,2,3];
        let newArr=[];
        for(let i=0;i<arr.length;i++){
            for(var j=0;j<newArr.length;j++){
                if(arr[i] == newArr[j]){
                    break
                }
                
            }
            if(j === newArr.length) {
                newArr.push(arr[i])
                }
        }
        console.log(newArr)
  1. 对初始值数组进行每一项与目标数组每一项进行比较
  2. 如果有重复就跳出循环
  3. 如果全部都不相等,那么j就会等于res.length。此时,把值添加到res中

由于是双层循环 效率也不会提高多少

四、利用ES6 new Set()

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

但不知道为什么京东笔试的时候不支持这样去重

五、利用includes

		let arr = [1,2,3,1,2,3];
        let newArr=[];
        for(let i=0;i<arr.length;i++){
            if(!newArr.includes(arr[i])){
                newArr.push(arr[i])
            }
        }
        console.log(newArr) 

六、利用hasOwnProperty去重

		let arr = [1,2,3,1,2,3];
        let obj={}
        let newArr= arr.filter((item)=>{
            if(obj.hasOwnProperty(typeof item + item)){
                return false
            }else{
                obj[typeof item + item] = true
                console.log(obj)
                return true
            }
        })
        console.log(newArr) //此方法可以去重{}、NAN

typeof item + item可以输出"item数据类型 + item值"的字符串结果

hasOwnPrototype()来判断obj内是否有这个数据类型的数据,如何没有就存入obj中,如果有那么就直接返回false,根据filter()的用法,这个数据就会被过滤掉。

七、利用filter + indexOf

跟上面的差不多 不讨论

参考链接:https://segmentfault.com/a/1190000016418021#articleHeader9

效率:Set>sort>双层循环>indexOf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值