JS实现数组去重的11种方法总结


Posted in Javascript onApril 04, 2022

1.ES5常用:利用for嵌套for,然后splice去重

function unique(arr) {
        for (var i = 0; i < arr.length; i++) {
            for (var j = i + 1; j < arr.length; j++) {
                if (arr[i] == arr[j]) { //第一个等同于第二个,splice方法删除第二个
                    arr.splice(j, 1);
                    j--;
                }
            }
        }
        return arr;
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(unique(arr))

JS实现数组去重的11种方法总结

解析:两个null消失,NaN和{}没有去重

2.ES6常用:Set去重

function unique(arr) {
        return Array.from(new Set(arr))
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(unique(arr))

JS实现数组去重的11种方法总结

解析:去重代码少。但是无法去除{}空对象。

3.indexOf去重

function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return
        }
        var array = [];//新建空数组,for循环原数组,判断数组是否存在当前元素,如果相同的值跳过,不同push进数组
        for (var i = 0; i < arr.length; i++) {
            if (array.indexOf(arr[i]) === -1) {
                array.push(arr[i])
            }
        }
        return array;
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(unique(arr))

JS实现数组去重的11种方法总结

解析:NaN、{}没有去重

4.sort()排序

//排序后的结果,遍历对比
    function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return
        }
        arr = arr.sort()
        var arrray = [arr[0]];
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] !== arr[i - 1]) {
                arrray.push(arr[i]);
            }
        }
        return arrray
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(unique(arr))

JS实现数组去重的11种方法总结

解析:NaN、{}没有去重

5.对象属性不能相同(不建议)

function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return
        }
        var array = [];
        var obj = {};
        for (var i = 0; i < arr.length; i++) {
            if (!obj[arr[i]]) {
                array.push(arr[i])
                obj[arr[i]] = 1
            } else {
                obj[arr[i]]++
            }
        }
        return array;
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(unique(arr))

JS实现数组去重的11种方法总结

解析:两个true去掉,NaN和{}没有去重

6.includes()

function unique(arr) {
        if (!Array.isArray(arr)) {
            console.log('type error!')
            return
        }
        var array = [];
        for (var i = 0; i < arr.length; i++) {
            if (!array.includes(arr[i])) { //includes 检测数组是否有某个值
                array.push(arr[i]);
            }
        }
        return array
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(unique(arr))

JS实现数组去重的11种方法总结

解析:{}没有去重

7.hasOwnProperty

function unique(arr) {
    var obj = {};
    return arr.filter(function(item, index, arr){
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}

JS实现数组去重的11种方法总结

解析:所有都去重

8.filter

function unique(arr) {
        return arr.filter(function (item, index, arr) {
            //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
            return arr.indexOf(item, 0) === index;
        });
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null,     NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(unique(arr))

JS实现数组去重的11种方法总结

解析:{}没有去重、NaN两个都没有了

9.利用递归去重

 function unique(arr) {
        var array = arr;
        var len = array.length;

        array.sort(function (a, b) { //排序后更加方便去重
            return a - b;
        })

        function loop(index) {
            if (index >= 1) {
                if (array[index] === array[index - 1]) {
                    array.splice(index, 1);
                }
                loop(index - 1); //递归loop,然后数组去重
            }
        }
        loop(len - 1);
        return array;
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(unique(arr))

JS实现数组去重的11种方法总结

解析:NaN和{}没有去重

10.Map去重

function arrayNonRepeatfy(arr) {
        let map = new Map();
        let array = new Array(); // 数组用于返回结果
        for (let i = 0; i < arr.length; i++) {
            if (map.has(arr[i])) { // 如果有该key值
                map.set(arr[i], true);
            } else {
                map.set(arr[i], false); // 如果没有该key值
                array.push(arr[i]);
            }
        }
        return array;
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(arrayNonRepeatfy(arr))

JS实现数组去重的11种方法总结

解析:创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。{}空对象无法去重。

11.reduce+includes

function unique(arr) {
        return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
    }
    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,
        'NaN', 0, 0, 'a', 'a', {}, {}
    ];
    console.log(unique(arr));

JS实现数组去重的11种方法总结

解析:{}无法去重

以上就是JS实现数组去重的11种方法总结的详细内容,更多关于JS数组去重的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JS实现打开本地文件或文件夹
Mar 09 Javascript
通过Unicode转义序列来加密,按你说的可以算是混淆吧
May 06 Javascript
javascript 添加和移除函数的通用方法
Oct 20 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
浅谈javascript中的数据类型转换
Dec 27 Javascript
详解Vue爬坑之vuex初识
Jun 14 Javascript
vue + element-ui的分页问题实现
Dec 17 Javascript
JS实现的简单tab切换功能完整示例
Jun 20 Javascript
JavaScript页面加载事件实例讲解
Sep 01 Javascript
layui 数据表格复选框实现单选功能的例子
Sep 19 Javascript
vue在路由中验证token是否存在的简单实现
Nov 11 Javascript
Postman参数化实现过程及原理解析
Aug 13 Javascript
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 #Vue.js
JavaScript模拟实现网易云轮播效果
Javascript中Microtask和Macrotask鲜为人知的知识点
vue中div禁止点击事件的实现
Apr 02 #Vue.js
Vue组件更新数据v-model不生效的解决
Apr 02 #Vue.js
Vue+TypeScript中处理computed方式
Apr 02 #Vue.js
Vue+Flask实现图片传输功能
Apr 01 #Vue.js
You might like
PHP4实际应用经验篇(6)
2006/10/09 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
php微信开发之谷歌测距
2018/06/14 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
微信小程序实现星星评分效果
2020/11/01 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
python海龟绘图实例教程
2014/07/24 Python
Python常用的爬虫技巧总结
2016/03/28 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
手工社团活动方案
2014/02/17 职场文书
法制主题班会教案
2015/08/13 职场文书
团委副书记工作总结
2015/08/14 职场文书
《日月潭》教学反思
2016/02/20 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python