引言

数组去重是前端面试的一个必备题目,其具体表现内容为:怎样去掉Javascript的Array的重复项。问题简单直接,咱们也废话不多说,直入主题吧。

一般姿势

使用数组的indexOf()方法可以很简单的达到目的。

Array.prototype.unique = function() {// 创建一个新的临时数组,用于保存输出结果var n = []; // 遍历当前数组for (var i = 0; i < this.length; i++) {// 如果当前数组的第i个元素已经保存进了临时数组,那么跳过,否则把当前项push到临时数组里面if (n.indexOf(this[i]) == -1) n.push(this[i]);}return n;
}

再列出一个变换一点的方式。

Array.prototype.unique = function() {// 创建一个新的临时数组,并且把当前数组的第一元素存入到数组中var n = [this[0]]; // 从第二项开始遍历for (var i = 1; i < this.length; i++) {// 如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉,否则存入结果数组if (this.indexOf(this[i]) == i) n.push(this[i]);}return n;
}

JS引擎在实现indexOf()的时候会遍历数组直到找到目标为止,此函数会浪费掉很多时间。所有这两种方式都不是最优的解决方式。

// 另一个简洁粗暴的方法
Array.prototype.unique = function() {return this.filter((v, i) => this.indexOf(v) === i)
}

感谢oxyflour童鞋提供的简单粗暴的一般姿势ES6改良版,优雅而简约 :)

最快姿势

把已经出现过的元素通过下标的形式存入一个Object内。下标的引用的实现原理利用的是哈希算法,要比用indexOf()搜索数组快的多。

Array.prototype.unique = function() {// n为hash表,r为临时数组var n = {}, r = [];for (var i = 0; i < this.length; i++) {// 如果hash表中没有当前项if (!n[this[i]]) {// 存入hash表n[this[i]] = true;// 把当前数组的当前项push到临时数组里面r.push(this[i]); }}return r;
}

但从耗时的角度来讲,这是最优的一种解决方式。但是从内存占用角度来说,这并不是最优的,因为多了一个hash表。这就是所谓的空间换时间(世间安得双全法?)。

中庸姿势

Array.prototype.unique = function() {this.sort();var re = [this[0]];for (var i = 1; i < this.length; i++) {if (this[i] !== re[re.length - 1]) {re.push(this[i]);}}return re;
}

这个方法的思路是先把数组排序,然后比较相邻的两个值。排序的时候用的JS原生的sort()方法,JS引擎内部应该是用的快速排序吧。这种方式比使用indexOf()一般姿势要快,比使用hash表的最快姿势要慢,但是占用内存要少。所以这算是委曲求全的一种中庸姿势。具体要用什么姿势,各位看官视情况而定吧。

改编自刘春龙博客中的文章《JS中数组去重问题》

数组去重的正确编写姿势相关推荐

  1. java数组去重_数组去重12种方案-你要的全在这

    首先我们先温习一下数组的常用的方法 pop push shift unshift slice splice sort reverse concat join indexOf lastIndexOf m ...

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

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

  3. android 字符串数组去重,GitHub - deng-ming-hao/ec-do: 实例为日常开发常用的小实例,包括数组去重,打乱数组,字母大小写转换,cookie操作的封装等。...

    ec-do 自己封装的常用操作实例 实例为日常开发常用的小实例,包括数组去重,打乱数组,字母大小写转换,cookie操作的封装等. 使用方法 引入ec-do.js //去除空格 ecDo.trim(' ...

  4. 论机器学习的正确学习姿势

    论机器学习的正确学习姿势 策划 | 刘燕作者 | Caleb Kaiser翻译 | Sambodhi编辑 | Linda很多开发人员并没有机器学习领域的背景,在机器学习如火如荼的今天,没学过机器学习的 ...

  5. php 数组去重_数组去重(JavaScript 为例)

    数组去重,就是在数组中查找相同的元素,保留其中一个,去除其他元素的程. 从这句话揭示了数组去重的两个关键因素: 找到重复项 去除重复项 本文告诉你在遇到去重问题时该如何思考,并以 JavaScript ...

  6. 前端面试题-数组去重和排序

    首先,不好意思,我昨天偷懒了,没有更新面试题,今日补上昨日的锅. 基于上次的对象转化题目,不少同学指出对象种的数组如果长度不一样,不能满足功能,所以针对这个进行优化,代码如下所示: <scrip ...

  7. class ts 扩展方法_ts类型声明文件的正确使用姿势

    ts类型声明文件的正确使用姿势 ts声明文件类型 npm install @types/jquery --save-dev 与npm一同发布 解释: package.json 中有 types 字段, ...

  8. javascript 练习(2)——js数组去重

    今天遇到一个数组去重的问题,如题 编写一个函数 unique(arr),返回一个去除数组内重复的元素的数组.例如:unique([0, 1, 2, 2, 3, 3, 4]) // => [0, ...

  9. JS数组去重方法小结

    JS数组去重 看了网上很多数组去重方法,用的比较常见的大概就几种,今天想自己来做一个总结. 部分内容参考该博客 1 . 在原数组上操作(基本方法) 思路:利用循环嵌套,判断数组中每个元素与其后面的元素 ...

最新文章

  1. SAP QM 由于存在未清TO单导致QA11失败
  2. ASP.NET常见错误,原因及解决方法(2003版)_不断更新.....
  3. 全新的图形数据库云服务Amazon Neptune正式发布
  4. TCP/IP总结(1)分层
  5. call和ret(f)指令
  6. 各种initcall的执行先后顺序(module_init、postcore_initcall、arch_initcall、subsys_initcall、 fs_initcall)【转】...
  7. 陕师大计算机科学学院研究生,陕师大研究生
  8. Android 怎么退出整个应用程序?[转]
  9. 识别图片并可视化_数据可视化3大发展方向
  10. bzoj1355——2016——3——15
  11. 关于Initializing Spring root WebApplicationContext解决方法
  12. 浅谈关于QQ核360的恩怨纠纷
  13. navicat 导出 oracle数据 乱码,Navicat Premium下sql导入中文乱码解决方案
  14. 向日葵服务器维护,向日葵远程服务器
  15. slic3r prusaslicer编译
  16. JasperReport生成pdf文件 Java开发pdf文件 pdf文件生成及下载
  17. Silver-Slides Chapter 1 - 强化学习入门:基本概念介绍
  18. 管理的角度分析:团队建设、团队管理、团队文化、沟通与辅导、招聘与解雇等
  19. anki 新的卡片类型_Anki选择题卡片制作详解
  20. Cognitively-Inspired Model for Incremental Learning Using a Few Examples(附翻译)

热门文章

  1. CYQ.DBImport 数据库反向工程及批量导数据库工具 V1.0 发布
  2. 软件工程心理学之---让客户知错,但不能向你发怒
  3. [JavaME]手机申请移动分配的动态IP(3)?
  4. SQLServer的数据类型
  5. Python爬虫-爬取扇贝单词(Xpath)
  6. NFS 网络文件系统测试笔记
  7. 浅谈C中的指针和数组(一)
  8. linux svn 开机启动
  9. linux 常用的系统信息查看命令
  10. MA5680T跨板聚合