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


相关推荐

  • WriteProcessMemory函数说明

    WriteProcessMemory函数说明WriteProcessMemory目录概览C++VB编辑本段概览WriteProcessMemory此函数能写入某一进程的内存区域。入口区必须可以访问,否则操作将失败。编辑本段C++此函数能写入

    2022年7月2日
    29
  • TextView 使用自定义的字体和亮点

    TextView 使用自定义的字体和亮点

    2021年12月17日
    45
  • 如何辨认正版mt4_真假鉴别软件

    如何辨认正版mt4_真假鉴别软件在全球零售外汇行业,外汇经纪商使用最多的还是俄罗斯迈达克公司的MT4交易平台,一些不合规的外汇经纪商也对MT4十分热衷,这使市场上几千块一个的盗版MT4日益猖獗,致使一部分交易者因此遭受一些不必要的利益侵害。那么MT4。fOrex6。cc的特点是什么?如何判别一个MT4软件是否是盗版?今天就带你们辨别真假MT4.MT4的优势1.强大的工作表现MT4强大的工作表现,这一点是毋庸置疑的。MT4自2005年7月1日推出以来,就不断的获得市场的认可。下单灵活、界面友好、交易直观等这些都是MT4平台成为外汇市场

    2022年4月19日
    69
  • 物流查询api接口的优点_快递100api收费标准

    物流查询api接口的优点_快递100api收费标准http://cha.chawuliu.cn/?stype=kd&amp;q=801396331098711823

    2025年7月20日
    0
  • from flask import jsonify

    from flask import jsonifyjsonify是flask中的扩展包,可以将数据转换成json数据。#打开已新建的文件,导入Flask,jsonifyfromflaskimportFlask,jsonify#调用Flask(__name__),并赋值给变量appapp=Flask(__name__)#定义一个json对象数据,然后赋值给变量datadata=[{“sname”:”朱华”,”age”:”20″,”sex”:”男”},{“sname”:”张素”,”age”:”30″,”sex”

    2022年5月23日
    28
  • 怎么判断Long类型为空_java将list转为string

    怎么判断Long类型为空_java将list转为stringList<String>和List<Long>类型相互转化 jdk 8.0 新特性

    2022年4月20日
    625

发表回复

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

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