JavaScript数组去重的几种方法
这个老问题,网上普遍都有了,为什么要再写一遍呢,主要是为了记个笔记。。。
遍历时搜索结果数组
思路很明确,如下
- 新建一个数组存放结果
- 循环遍历原数组,对于每一个元素,在结果数组中搜索是否存在
- 若不存在则存入结果数组中,返回第二步,直到循环结束
代码就不上了,网上一大把。
这是最直接的方法,但由于嵌套了循环,效率不高。
先排序后比较
- 先将原数组进行排序
- 新建一个结果数组
- 遍历排序后的数组,比较第i个元素与结果数组的最后一个元素是否相等
- 如果不相等则存入结果数组
同不上代码。
速度是快了些,但返回的是一个排序后的数组,并且有更快的方法。
使用对象记录已有元素
这个方法使用hashtable结构,避免了循环嵌套,而且返回的数组顺序没改变,效率也高。
主要思路是将原数组的元素作为对象的属性名来记录是否出现过:
- 新建一个对象与结果数组
- 遍历原数组,对于第i个元素,访问对象中属性名为i的属性
- 如果属性不存在,则标记此属性为true,并将此元素存入结果数组中,返回第二步直到循环结束
但是这样做也有个问题,对象的属性名在访问时会被转换为字符串,因此不同类型的值也可能被去重,
比如数字0跟字符’0’
解决办法:将hashtable中的标记 true ,改为保存出现过的类型的数组,在判断元素是否出现时,多判断一步保存的类型数组中是否出现过此类型即可
Array.prototype.unique = function()
{
var n = {}, r = [], len = this.length, val, type;
for (var i = 0; i < this.length; i++) {
val = this[i]; //数组元素
type = typeof val; //数组元素的类型
if (!n[val]) { //如果没有记录
n[val] = [type]; //保存类型
r.push(val); //保存元素到结果数组
} else if (n[val].indexOf(type) < 0) { //如果有记录,判断其类型是否在记录数组中,如果没有
n[val].push(type); //将此类型添加到记录数组中
r.push(val); //保存元素到结果数组
}
}
return r;
}
此方法效率高,并且返回的数组元素顺序不变。
ES6
ES6的许多新特性让人眼前一亮,最近拜读阮一峰老师的ECMAScript 6入门,又皮卡了一种新的数组去重方法
就是利用扩展运算符(…)跟Set数据结构的不重复特性来达到给数组去重的目的。
Array.prototype.unique = function(){
return [...new Set(this)];
};
…就一行代码,简洁。
参考
JavaScript数组去重的几种方法的更多相关文章
- JavaScript数组去重的10种方法
「数组去重」的确是个老生常谈的问题了,但是你真正的掌握了吗?平时开发中是不是用最简单粗暴的方法来去重?注意到它的性能问题了吗?当面试官对你回答的四个去重方法都不满意时你可以想出更简单且性能能更好的方法 ...
- JavaScript数组去重的四种方法
今天,洗澡的想一个有趣的问题,使用js给数组去重,我想了四种方法,虽然今天的任务没有完成,5555: 不多说,po代码: //方法一:简单循环去重 Array.prototype.unique1 ...
- [转] JavaScript数组去重(12种方法)
数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码.如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看.在真实的项目中碰到的数组去重,一般都是 ...
- javascript数组去重的3种方法
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! javascript数组去重 <!DOCTYPE html> <html> < ...
- JavaScript数组去重(12种方法,史上最全)
参考博客:https://segmentfault.com/a/1190000016418021?utm_source=tag-newest
- JavaScript中数组去重的几种方法
JavaScript中数组去重的几种方法 正常情况下,数据去重的工作一般都是由后端同事来完成的,但是前端也要掌握好处理数据的能力,万一去重的工作交给我们大前端处理,我们也不能怂呀.现在我总结了一些去重 ...
- js中数组去重的几种方法
js中数组去重的几种方法 1.遍历数组,一一比较,比较到相同的就删除后面的 function unique(arr){ ...
- JavaScript数组去重的7种方式
1.利用额外数组 function unique(array) { if (!Array.isArray(array)) return; let newArray = []; fo ...
- 关于数组去重的几种方法-------javascript描述
第一种方法:借助json对象来实现,若json对象中无该属性则添加,否则不添加,最后返回json对象的属性,时间复杂度为O(n) function deleteArrayRepeat(arr) { v ...
随机推荐
- asp.net 上传文件超过了最大请求长度
今天系统遇到了一个问题,上传4m以上的文件,uploadify就会报错:超过了最大请求长度. 开始我以为是设置的大小,可是后来我看了uploadify的fileSizeLimit=1024*10,也就 ...
- appStore上传苹果应用程序软件发布流程
如有疑问,或者需要人帮忙,可以到QQ群:460325065首先确定帐号是否能发布, https://developer.apple.com/account,如果你打开Provisioning Port ...
- GridView模版列中设置
在GridView模版列中设置如下<asp:TemplateField HeaderText="删除"> <ItemTemplate> ...
- WinForm跨窗体传值
1.另一窗体建公共变量listdataRow public List<DataGridViewRow> listdataRow = new List<DataGridViewRow& ...
- java 标签库(核心,xml,sql ,国际化,函数)
java标签库分分为上述几种,一般经常使用的是核心和函数,接下来会分别讲解这几种,和常见的用法. 一般标签库会和el表达式一起使用,所以在学习标签库前最后也学习下el表达式的使用. 导入后展开 可以从 ...
- The certificate used to sign ***has either expired or has been revoked. An updated certificate is required to sign and install the application
真机测试的时候弹出这样的提示:The certificate used to sign ***has either expired or has been revoked. An updated ce ...
- AngularJS 包含
在 AngularJS 中,你可以在 HTML 中包含 HTML 文件. 在 HTML 中,目前还不支持包含 HTML 文件的功能. 大多服务端脚本都支持包含文件功能 (SSI: Server Sid ...
- JQuery UI dialog 弹窗实例及参数说明
按钮代码: <a id="suprise" style="margin-left: 0.5em;cursor:pointer;">点我会有惊喜< ...
- NotePad++中如何出去闪烁的光标?
当在写代码时出现的光标闪烁(横线闪烁),在键盘上找 Insert ,按这个Insert就可以把横向闪烁光标( _ )修改成竖向闪烁光标样式( | ),横向光标会在你写代码的时候修改前面的代码,把光标移 ...
- 使用Word 2013发布cnblogs随笔
博客园支持Word或者OneNote一键发布文章. 获取cnblogs的URL地址,类似http://rpc.cnblogs.com/metaweblog/your_name 打开word中的管理账户 ...