你可能不知道的JS数组去重方法

发布时间:2019-08-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了你可能不知道的JS数组去重方法脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

利用ES6的Set集合

利用ES6 Set集合成员具有唯一值的特性,再借助Array.From将类数组转为真正的数组
我们可以很简单的完成数组去重任务

let res = @H_304_20@Array.from(new Set(arr));

indexOf和filter的配合

indexOf():
返回数组中某个指定的元素第一次出现的位置(索引)。如果在数组中没找到指定元素则返回 -1。
filter():
返回指定数组中符合条件的所有元素
关键语句:

index === array.indexOf(ele)

我们利用indexOf得到的下标与当前元素的下标来判断这个元素是否是第一次出现,然后在利用filter的过滤特性即可。
这里需要注意的判断NaN,因为 NaN !== NaN,所以indexOf(NaN)始终返回-1,所以我们需要额外去判断

Array.PRototyPE.uniq = function(){
    let flag = true;             // 定义标记用来判断NaN
    return this.filter((ele, index, array) => {
        if(flag && ele!==ele){
            flag = false;
            return true;
        }
        return index===array.indexOf(ele)
    })
}

③利用对象的键

核心:利用对象的键来存储我们的元素
如果没有对象中没有这个键,则进行存储,并设置这个键对应值为true表明已经存在该元素

Array.prototype.uniq = function(){
    let hash = {};
    let data = [];
    this.foreach(ele => {
        if (!hash[ele])  {
            hash[ele] = true;
            data.push(ele);
        }    
    })
   return data;
}    

注意:由于普通对象的键都是字符串,所以对于像 Number(1)和String(1)则视为它们是同一值,无法正确判断,对于引用类型的数据也是如此( 如 {} 和 {} 视为同一值)

解决办法:在ES6中提供了Map集合,Map的键不再局限于字符串,而是任意类型,可以说是一个完整的hash结构,利用Map替换普通对象{}则可以解决上面的问题

Array.prototype.uniq = function(){
    let map = new Map();
    let data = [];
    this.forEach(ele => {
        if(!map.get(ele)){
            map.set(ele, true);
            data.push(ele);
        }
    });
    return data;
}

数组排序,比较相邻元素

在数组排序后,相同的数据会集中在一起,因此只需要比较相邻元素是否相等即可,
比较符可以用 严格比较运算符(===) 或者 Object.is()
它们不同之处只有两个:一是+0不等于-0,二是NaN等于自身。
所以对于NaN,如果使用===,则需要额外判断
根据如下方案数组最后一个元素必然是唯一值,所以在循环后把末尾的元素添加进去

Array.prototype.uniq = function(){
    let res = [];
    let arr = this.sort();
    for(let i = 0; i < arr.length-2; i++){
        if(!Object.is(arr[i], arr[i+1])){
            res.push(arr[i])
        }
    }
    res.push(arr.pop());
    return res;
}

脚本宝典总结

以上是脚本宝典为你收集整理的你可能不知道的JS数组去重方法全部内容,希望文章能够帮你解决你可能不知道的JS数组去重方法所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。