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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HttpURLConnection_浅析情绪管理的方法技巧论文

    HttpURLConnection_浅析情绪管理的方法技巧论文前言申请CSDN账号大概是四年前的事情了,想想的确的有点历史久远的感觉,只不过这段历史中,我的博客却是历史空白的,主要原因是,当时只是因为是计算机专业,而沽名钓誉的申请了个高大上的CSDN—中国最大的中文IT社区账号,中间经历了稀里糊涂匆匆大一、稍稍有点叱诧风云、指点江山的给力大二、紧接着铮铮铁骨、血性火热的绿色军营,辗转几个春夏轮回,我又回到了曾几何时的“历史舞台”,重新开始了我“武林秘…

    2022年9月11日
    2
  • beancopier 深拷贝_对象的拷贝有几种方法

    beancopier 深拷贝_对象的拷贝有几种方法BeanCopier对象拷贝packagecom.xmsme.nicsp.monitor.util;importjava.util.List;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;importorg.springframework.cglib.beans.BeanCopier;/***BeanCopier工具类**@authorzwy*/public…

    2025年9月12日
    6
  • C++11新特性之线程操作

    C++11之前没有对并发编程提供语言级别的支持,这使得我们在编写可移植的并发程序时,存在诸多的不便。现在C++11增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到

    2021年12月28日
    39
  • python基础知识点汇总

    python基础知识点汇总本文包括python基本知识:简单数据结构,数据结构类型(可变:列表,字典,集合,不可变:数值类型,字符串,元组),分支循环和控制流程,类和函数,文件处理和异常等等。(1)简单数据结构标识符第一个字符必须是字母表中字母或下划线_。 标识符的其他的部分由字母、数字和下划线组成。 标识符对大小写敏感。python中数字有四种类型:整数、布尔型、浮点数和复数。int(整数),如1,只有一种整数类型int,表示为长整型,没有python2中的Long。 bool(…

    2022年10月16日
    3
  • 有关微信登录小程序接口40029报错

    有关微信登录小程序接口40029报错有关微信登录小程序接口40029报错微信的报错信息errcode:40029,errmsg:"invalidcode,hints:[req_id:HQd79a0747th31]我的可能是例外,但是应该不是个例!微信验签等代码是copy上一个项目的!而且我的项目用上一个的小程序/公众号写过测试,小程序/公众号中做过相应配置!所以以上错误很可能是你的APPID和app_…

    2022年5月5日
    61
  • sql注入之报错注入「建议收藏」

    sql注入之报错注入「建议收藏」报错注入报错注入在没法用union联合查询时用,但前提还是不能过滤一些关键的函数。报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误和concat+rand()+group_by()导致主键重复xpath语法错误利用xpath语法错误来进行报错注入主要利用extractvalue和updatexml两个函数。使用…

    2022年9月30日
    2

发表回复

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

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