数组去重的正确编写姿势
引言
数组去重是前端面试的一个必备题目,其具体表现内容为:怎样去掉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中数组去重问题》
数组去重的正确编写姿势相关推荐
- java数组去重_数组去重12种方案-你要的全在这
首先我们先温习一下数组的常用的方法 pop push shift unshift slice splice sort reverse concat join indexOf lastIndexOf m ...
- java数组去重_再谈JavaScript数组去重
JavaScript的数组去重是一个老生常谈的话题了.随便搜一搜就能找到非常多不同版本的解法. 细想一下,这样一个看似简单的需求,如果要做到完备,涉及的知识和需要注意的地方着实不少. 定义重复(相等) ...
- android 字符串数组去重,GitHub - deng-ming-hao/ec-do: 实例为日常开发常用的小实例,包括数组去重,打乱数组,字母大小写转换,cookie操作的封装等。...
ec-do 自己封装的常用操作实例 实例为日常开发常用的小实例,包括数组去重,打乱数组,字母大小写转换,cookie操作的封装等. 使用方法 引入ec-do.js //去除空格 ecDo.trim(' ...
- 论机器学习的正确学习姿势
论机器学习的正确学习姿势 策划 | 刘燕作者 | Caleb Kaiser翻译 | Sambodhi编辑 | Linda很多开发人员并没有机器学习领域的背景,在机器学习如火如荼的今天,没学过机器学习的 ...
- php 数组去重_数组去重(JavaScript 为例)
数组去重,就是在数组中查找相同的元素,保留其中一个,去除其他元素的程. 从这句话揭示了数组去重的两个关键因素: 找到重复项 去除重复项 本文告诉你在遇到去重问题时该如何思考,并以 JavaScript ...
- 前端面试题-数组去重和排序
首先,不好意思,我昨天偷懒了,没有更新面试题,今日补上昨日的锅. 基于上次的对象转化题目,不少同学指出对象种的数组如果长度不一样,不能满足功能,所以针对这个进行优化,代码如下所示: <scrip ...
- class ts 扩展方法_ts类型声明文件的正确使用姿势
ts类型声明文件的正确使用姿势 ts声明文件类型 npm install @types/jquery --save-dev 与npm一同发布 解释: package.json 中有 types 字段, ...
- javascript 练习(2)——js数组去重
今天遇到一个数组去重的问题,如题 编写一个函数 unique(arr),返回一个去除数组内重复的元素的数组.例如:unique([0, 1, 2, 2, 3, 3, 4]) // => [0, ...
- JS数组去重方法小结
JS数组去重 看了网上很多数组去重方法,用的比较常见的大概就几种,今天想自己来做一个总结. 部分内容参考该博客 1 . 在原数组上操作(基本方法) 思路:利用循环嵌套,判断数组中每个元素与其后面的元素 ...
最新文章
- SAP QM 由于存在未清TO单导致QA11失败
- ASP.NET常见错误,原因及解决方法(2003版)_不断更新.....
- 全新的图形数据库云服务Amazon Neptune正式发布
- TCP/IP总结(1)分层
- call和ret(f)指令
- 各种initcall的执行先后顺序(module_init、postcore_initcall、arch_initcall、subsys_initcall、 fs_initcall)【转】...
- 陕师大计算机科学学院研究生,陕师大研究生
- Android 怎么退出整个应用程序?[转]
- 识别图片并可视化_数据可视化3大发展方向
- bzoj1355——2016——3——15
- 关于Initializing Spring root WebApplicationContext解决方法
- 浅谈关于QQ核360的恩怨纠纷
- navicat 导出 oracle数据 乱码,Navicat Premium下sql导入中文乱码解决方案
- 向日葵服务器维护,向日葵远程服务器
- slic3r prusaslicer编译
- JasperReport生成pdf文件 Java开发pdf文件 pdf文件生成及下载
- Silver-Slides Chapter 1 - 强化学习入门:基本概念介绍
- 管理的角度分析:团队建设、团队管理、团队文化、沟通与辅导、招聘与解雇等
- anki 新的卡片类型_Anki选择题卡片制作详解
- Cognitively-Inspired Model for Incremental Learning Using a Few Examples(附翻译)