虽然算法在前端开发中很少会得以使用,但是了解常用的算法,熟悉各种算法的性能和优劣,将会让你在前端的道路上走的更远。

前言

文中所有代码位于位于此代码仓库中,大家可以下载代码进行学习、推敲和改进。另,如果觉得这些用心推敲的代码对你有帮助的话,欢迎 star 一下代码仓库,众筹博主的小星星。

另外,本文中使用如下函数对代码进行性能测试:

module

为了衡量性能,我们引入代码时间复杂度的概念,用大写O()来表现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。

1.双重for循环去重

如果有相同的值则跳过,不相同则push进数组

function distinct1(arr = testArr) {let result = [],len = arr && arr.length;for (let i=0; i< len; i++) {for (let j=i+1; j< len; j++) {if (arr[i] === arr[j]) {j = ++i;}}result.push(arr[i])}return result
}

由于使用了双层for循环,根据代码可知时间复杂度为O(n^2),用测试函数测的19815条数据的去重时间为:7-8ms;

2.利用indexOf和forEach/for循环去重

function distinct2(arr = testArr) {let result = [];arr.forEach((v, i, array) => {array.indexOf(v, i+1) === -1 && result.push(v)});return result
}

可以看到该方法的代码很简洁,时间复杂度为O(n),但是indexOf会进行额外的性能消耗,测试相同的数据耗时为:4-5ms

3.对象法

通过利用对象建名的唯一性去去重

function distinct3(arr = testArr) {let result = [], resultObj = {}, len = arr.length;for(let i=0; i< len; i++) {let val = arr[i],type = typeof val;if(!resultObj[val]) {result.push(val);resultObj[val] = [type];} else if(!resultObj[val].indexOf(type) < 0) {result.push(val);resultObj[val] = [type];}}return result
}

该方法很快,时间复杂度为O(n),但是由于会多创建一个对象,会带来额外的内存开销,尤其是数据量大的情景下,测试相同的数据耗时为:5ms

4.filter去重方法一

利用filter和indexOf来查询

function distinct4(arr = testArr) {return arr.filter((v, i, array) => array.indexOf(v, i+1) < 0)
}

该方法也很简洁,测试相同的数据耗时为:4-5ms,关键优化点是利用indexOf的第二个参数去避免不必要的查询。

5.filter去重方法二

和方法4的区别是利用数组的索引的唯一性来去重

function distinct5(arr = testArr) {return arr.filter((v, i, array) => array.indexOf(v) === i)
}

该方法同4,但是性能远不如方法4,因为数组每次调用indexOf都会重新查找整个数组,但这是必须要做的操作,否则就不能利用数组索引的唯一性了。耗时:16ms(小伙伴们都惊呆了)

6.利用es6的set方法

function distinct6(arr = testArr) {return [...new Set(arr)]
}

此方法耗时1ms,但是局限性很大,针对相同类型的数据很快,但是不同类型的数据去重,将非常慢,这涉及到js相关的底层知识,这里就先不介绍了,后期需要的话可以专门上一篇文章介绍~

好啦,其实数组去重有很多种方法,只有你想不到的,没有实现不了的,如果你有更好更快的方法,欢迎一起交流探讨哦~

es6 数组去重_《前端算法系列》数组去重相关推荐

  1. java算法判断链表有没有闭环_前端算法系列之二:数据结构链表、双向链表、闭环链表、有序链表...

    前言 上一次我们讲到了数据结构:栈和队列,并对他们的运用做了一些介绍和案例实践:我们也讲到了怎么简单的实现一个四则运算.怎么去判断标签是否闭合完全等等,anyway,今天接着和大家介绍一些数据结构: ...

  2. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和

    题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...

  3. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...

    题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...

  4. c++ 二维数组 排序_【算法】排序算法之计数排序

    前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...

  5. 数组中某个元素相同的去重_几种去除数组中重复元素的方法、数组去重

    工作中遇到的一个问题,就是去除数组中重复的元素,记录一下几种有效的方法: 第一种思路:遍历要删除的数组arr, 把元素分别放入另一个数组tmp中,在判断该元素在arr中不存在才允许放入tmp中. 去除 ...

  6. java数组去重_再谈JavaScript数组去重

    JavaScript的数组去重是一个老生常谈的话题了.随便搜一搜就能找到非常多不同版本的解法. 细想一下,这样一个看似简单的需求,如果要做到完备,涉及的知识和需要注意的地方着实不少. 定义重复(相等) ...

  7. [饭后算法系列] 数组中和非负的最长子数组

    1. 问题 给定一列数字数组 a[n], 求这个数组中最长的 "和>=0" 的子数组. (注: "子数组"表示下标必须是连续的. 另一个概念"子 ...

  8. java 数组 算法_常见算法总结 - 数组篇

    1.给定一个数值在1-100的整数数组,请找到其中缺少的数字. 找到丢失的数字 利用byte数组的1或0标记该数字是否被删除,例如byte数组下标为0的数值为1的话,代表数字1存在 public st ...

  9. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  10. gif透明背景动画_前端基础系列之bmp、jpg、png、gif、svg常用图片格式浅谈(二)...

    IT客栈 作者:大腰子 bmp.jpg.png.gif.svg常用图片格式 之前为大家介绍了几种WEB前端常用的图片格式,对比了它们的特点,参见<前端基础系列之bmp.jpg.png.gif.s ...

最新文章

  1. “耐撕”团队2016.04.12站立会议
  2. ASP.NET中防止页面多次加载的IsPostBack属性
  3. 【技术原创】MailEnable开发指南
  4. PHP 梯形图,学习PLC,不要先翻资料,干就完了.搞起你的第一个梯形图.
  5. 伯克利计算机科学研究生,加州大学伯克利分校
  6. c语言算法加数据结构等于,数据结构算法(多项式加法)的C语言完美实现
  7. LeetCode 1218. 最长定差子序列(哈希map)
  8. 计算机重启是什么原因,电脑自动重启,该怎么办,到底是什么原因,我来详细说明?...
  9. 苏宁大数据怎么运营_【苏宁大数据部门怎么样?进去能学到技术吗?】-看准网...
  10. python虚拟环境windows环境搭建_window10配置python虚拟环境的路径
  11. 高中数学对计算机,对高中数学计算机学习技巧的探讨
  12. windows 技巧篇-解除共享文件夹占用方法,解决共享文件被占用导致不可修改问题,查看共享文件被谁占用方法
  13. R-S编码译码-缩短码(10,6)
  14. Python爬虫实战 - 抓取BOSS直聘职位描述 和 数据清洗
  15. Android 简单直接--无需jar包zing实现生成、扫描二维码
  16. Python学习小组课程P2-Python基础(2)文件操作
  17. 成绩管理系统(C语言)完整代码,纯C的练手程序
  18. 疯狂的架构,BAT加华为、联想、新浪公司组织结构图一览
  19. 乳腺癌2002~2018城市和乡村个年龄段患病率曲线图绘制 ---pyechart
  20. bt云服务器地址,windows服务器使用BT搭建环境

热门文章

  1. 【Elasticsearch】match_phrase搜不出来,怎么办
  2. 【Elasticsearch】Elasticsearch 理解mapping中的store属性
  3. 10-10-020-简介-kafka的ZK上面的存储
  4. 95-230-026-源码-WordCount走读-本地运行SubmitJob的过程
  5. parquet : java.lang.NoSuchFieldError: BROTLI
  6. 07-霸道的Oracle内存使用
  7. 云计算学习路线图课件:云计算中的常见的云配置错误
  8. 把VS Code打造成Java开发IDE,也挺爽!
  9. 【コンテンツ配信高速化 】
  10. 包容网关 Inclusive Gateway