javascript数组去重set方法_js数组去重api

javascript数组去重set方法_js数组去重apiJavaScript数组去重

大家好,又见面了,我是你们的朋友全栈君。

数组去重的几种方法

  • 1.遍历数组法

这是最简单的数组去重方法,实现思路:新建一新数组,传入要去重的数组,遍历该数组,若值不在新数组中则加入该数组;需要注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,示例如下:

function removeDup(arr) {
    let new_arr = [];
    arr.forEach((val) => {
        if(new_arr.indexOf(val) === -1){
            new_arr.push(val);
        }
    });
    return new_arr;
}
  • 2.对象键值对法

思路:新建一对象以及数组,遍历传入的数组,判断值是否为js对象的键,若不是则新增键值,并放入数组中;需要注意的地方:判断是否为js对象键时,会自动对传入的键toString();

    function removeDup2(arr) {
        let obj = {},
            new_arr = [],
            val,
            type;
        for(let i = 0, len = arr.length; i < len; i+=1) {
            val = arr[i];
            type = typeof val;
            if(!obj[val]) {
                obj[val] = [type];
                new_arr.push(val);
            }else if(obj[val].indexOf(type) === -1) {
                obj[val].push(type);
                new_arr.push(val);
            }
        }
        return new_arr;
    }
缺点:无法真正区分两个对象,如:`{a:1}`和`{a: 2}`,因为typeof结果都是`"object"`,可用`JSON.stringify()`来解决;
es6优化后如下
    function unique(array) {
        let obj = {};
        let type;
        return array.filter((item, index, array) => {
            type = typeof item + JSON.stringify(item);
            return obj.hasOwnProperty(type) ? false : (obj[type] = item);
        } )
    }
    // 可去除undefined, NaN, Object重复项
  • 3.排序后相邻去除法


    思路:首先将要去重的数组使用sort方法排序后,相同的值就会排在一起,然后就可以只判断当前元素与上一个元素是否相同,若不同则添加进去;

        function unique(array) {
            let res = [];
            let sortedArray = array.slice(0).sort();//先排序
            let seen;//记录上一个元素
            for(let i = 0, len = sortedArray.length; i < len; i++) {
                let current = sortedArray[i];
                if(!i || seen !== current) {
                    res.push(current);
                }
                seen = current;
            }
            return res;
        }

    优化:可传入一个isSorted参数,表明该数组是否已排序,如果为true,那么就判断相邻元素是否相同;如果为false,则使用indexOf判断:

        function unique(array, isSorted) {
            let res = [];
            let seen;//记录上一个元素
            for(let i = 0, len = array.length; i < len; i++) {
                let current = array[i];
                if(isSorted) {
                    if(!i || seen !== current) {
                        res.push(current);
                    }
                    seen = current;
                }else if(res.indexOf(current) === -1) {
                    res.push(current);
                }
            }
            return res;
        }

    再优化:想象一个场景,你需要对数组的每一项进行一些处理,但又不想再遍历一次,那么可添加第三个参数itreatee,接受一个函数作为处理函数;

        function unique(array, isSorted, iteratee) {
            let res  = [];
            let seen = [];
            for(let i = 0, len = array.length; i < len; i++) {
                let value = array[i];
                let computed = iteratee ? iteratee(value, i, array) : value;
                if(isSorted) {
                    if(!i || seen !== computed) {
                        res.push(value);
                    }
                    seen = computed;
                }else if(iteratee) {
                    if(seen.indexOf(computed) === -1) {
                        res.push(value);
                        seen.push(computed);
                    }
                }else if(res.indexOf(value) === -1) {
                    res.push(value);
                }
            }
            return res;
        }
  • 4.ES6,Set和Map去重

    function unique(array) {
        return Array.from(new Set(array));
    }

    //扩展运算符简化
    let unique = (arr) => [...new Set(arr)];

    //使用Map
    function unique(array) {
        let seen = new Map();
        return arr.filter((a) => !seen.has(a) && seen.set(a, 1));
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107295.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【RPC Dubbo】dubbo负载均衡策略

    【RPC Dubbo】dubbo负载均衡策略文章目录前言参考前言在上一篇博客中,介绍了zookeeper作为dubbo的注册中心是如何工作的,有一个很重要的点,我们的程序是分布式应用,服务部署在几个节点(服务器)上,当消费者调用服务时,zk返回给dubbo的是一个节点列表,但是dubbo只会选择一台服务器,那么它究竟会选择哪一台呢?这就是dubbo的负载均衡策略了,本篇博客就来聚焦dubbo的负载均衡策略。参考dubbo负载均衡策略…

    2022年7月11日
    18
  • 专业编写c语言的软件,适合编写C语言代码的几款软件

    专业编写c语言的软件,适合编写C语言代码的几款软件C语言基本上是大学计算机及其相关专业在大一上学期就会开的一门课程,但是很多学生听得都是一些理论知识,其实究其主要原因,还是因为你在上课认真听了,但是却没有在课后好好的自己去主动敲代码,想要动手操作,就需要几款编程利器,手机电脑都可以,下面我们就先看一下手机软件:手机软件1.C语言编译器:这是手机上的一个C语言编程软件,可以直接在手机上编译运行C语言程序,下面我简单介绍一下这个软件:首先,下载安装C…

    2022年5月7日
    196
  • 金蝶java开发(金蝶中间件 开源)

    面试的是java开发岗1.首先是做一份笔试题,笔试题比较简单,主要是设计模式,sql查询,linux命令2.面试分3轮第一轮:1个面试官,总体答得还行比较全面的技术面试,包括了(1)jvm内存模型:堆栈,方法区,程序计数器,本地方法区,以及他们各种的作用(2)jvm垃圾回收算法:复制算法,标记-清除,标记-整理,以及他们使用的场景和大致的作用1)多线程:synchron…

    2022年4月15日
    168
  • WebRTC的学习(二)

    WebRTC的学习(二)

    2021年9月10日
    56
  • 【机器学习】一文读懂正则化与LASSO回归,Ridge回归

    【机器学习】一文读懂正则化与LASSO回归,Ridge回归该文已经收录到专题机器学习进阶之路当中,欢迎大家关注。1.过拟合当样本特征很多,样本数相对较少时,模型容易陷入过拟合。为了缓解过拟合问题,有两种方法:方法一:减少特征数量(人工选择重要特征来保留,会丢弃部分信息)。方法二:正则化(减少特征参数的数量级)。2.正则化(Regularization)正则化是结构风险(损失函数+正则化项)最小化策略的体…

    2022年6月10日
    36
  • intellij idea激活码2021_最新在线免费激活

    (intellij idea激活码2021)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月27日
    71

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号