数组去重的11种方法

(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))

解析:两个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))

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

(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))

解析: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))

解析: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))

解析:两个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))

解析:{}没有去重

(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)})
}

解析:所有都去重

(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))

解析:{}没有去重、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))

解析: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))

解析:创建一个空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));

解析:{}无法去重

数组去重的12种方法总结相关推荐

  1. JS----JavaScript数组去重(12种方法,史上最全)

    数组去重的方法 一.利用ES6 Set去重(ES6中最常用) Set 不包含重复元素的值的集合 Map 双列集合 键值对 与object的区别 : object中的key只能是string类型 而Ma ...

  2. java hashmap 去重_java数组去重的两种方法

    我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...

  3. 两个对象数组去重的3种方法

    两个对象数组去重的3种方法 前言 问题描述 解决方案一 解决方案二 解决方案三 前言 前段时间写过JavaScript数组去重最简单的 4 种方案,里面的数组元素是基本类型.本文要讲的数组元素是对象, ...

  4. java数组去重方法是,java数组去重的两种方法

    我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...

  5. JavaScript数组去重的五种方法

    JavaScript数组去重的五种方法 先简单准备一个数组,用于方法的实验: let array = [1,1,2,3,4,4,1,5,6,6,7,7,7]; console.log(`去重前的数组: ...

  6. 数组去重--这几种方法够不?

    数组去重,是校招面试的必考知识点.简单的说,数组去重就是将一个数组中的相同的元素删除,只保留其中的一个.这里的相同其实是一个陷阱,有好多同学只认为值相等即为相同,而忽略类类型的判断.所以大家在进行数组 ...

  7. Js中数组去重的几种方法

    前几天在看前端面试题的时候,其中js部分有个问题是实现数组去重的算法,一开始就想了一两种方法,后来仔细回忆了下这个题,觉得该问题实现方法确实不止局限于一两种方法 ,从不同的角度去看待该问题就会有多种实 ...

  8. js数组 去重的5种方法

    // 数组去重 var arr = [1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 4, 3, 5, 7, 11, 12, 11]; var newArr = [];//方法1最优 se ...

  9. 原生JS数组去重的几种方法

    有时候我们做项目的时候往往会需要把数组里面一些重复的项去掉,但是原生JS有排序,有筛选等等,但是就是没有数组去重怎么办呢? 这能怎么办,自己手动实现嘛.(以下代码直接在原型上添加的的方法,为的就是和原 ...

最新文章

  1. ma应用、超级短线、分钟短线买卖和看盘心得
  2. python找水仙花数_Python一句代码实现找出所有水仙花数的方法
  3. 3.Factory Method 工厂方法模式(创建型模式)
  4. Oracle中NVARCHAR2与VARCHAR2的相互转换
  5. 遇到一个sql2000的问题,实在搞不懂了,求解决的办法?
  6. 在读博士一作发Nature,学校重奖50万!
  7. linux iptables 编译,Linux下编译安装iptables
  8. Linux 实操 —— 日志筛选操作(sed与wc命令介绍)
  9. 阿里云服务器被挖矿怎么解决
  10. 注册页面的JSON响应方式详细分析(与前端页面交互方式之一)
  11. matplotlib画折线图中文乱码解决
  12. Leetcode461Hamming Distance汉明距离
  13. java算法竞赛入门经典_算法竞赛入门经典笔记(1-3章)
  14. 录音软件行业调研报告 - 市场现状分析与发展前景预测
  15. 散列表--数据结构与算法之美--CH18、CH19、CH20
  16. Win11系统右键没有解压选项!!!???
  17. 远程为华为RH2288V3服务器安装vmware esxi5.1操作系统
  18. 1024程序员节之长沙吃货打卡
  19. android电视横竖屏切换在哪里,Android横竖屏切换总结
  20. 刷脸支付无人便利店的使用体验也更好了

热门文章

  1. Unity5.x制作合金弹头(一)-DoTween组件的使用
  2. IT组织架构、岗位职责设计实战案例
  3. 一、领域驱动设计核心思想与设计过程
  4. java分布式(分布式架构)
  5. 为什么有人的人生跟开了挂一样?
  6. 心知天气api接口怎么用?
  7. 2006-2007NBA赛季球队一览
  8. 《2018年度回顾报告》
  9. 流利阅读 2019.1.25 Saudi thirst for water is creating a toxic brine problem
  10. argparse三步走使用说明