这个老问题,网上普遍都有了,为什么要再写一遍呢,主要是为了记个笔记。。。

遍历时搜索结果数组

思路很明确,如下

  • 新建一个数组存放结果
  • 循环遍历原数组,对于每一个元素,在结果数组中搜索是否存在
  • 若不存在则存入结果数组中,返回第二步,直到循环结束

代码就不上了,网上一大把。

这是最直接的方法,但由于嵌套了循环,效率不高。

先排序后比较

  • 先将原数组进行排序
  • 新建一个结果数组
  • 遍历排序后的数组,比较第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数组去重的几种方法的更多相关文章

  1. JavaScript数组去重的10种方法

    「数组去重」的确是个老生常谈的问题了,但是你真正的掌握了吗?平时开发中是不是用最简单粗暴的方法来去重?注意到它的性能问题了吗?当面试官对你回答的四个去重方法都不满意时你可以想出更简单且性能能更好的方法 ...

  2. JavaScript数组去重的四种方法

    今天,洗澡的想一个有趣的问题,使用js给数组去重,我想了四种方法,虽然今天的任务没有完成,5555: 不多说,po代码: //方法一:简单循环去重    Array.prototype.unique1 ...

  3. [转] JavaScript数组去重(12种方法)

    数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码.如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看.在真实的项目中碰到的数组去重,一般都是 ...

  4. javascript数组去重的3种方法

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! javascript数组去重 <!DOCTYPE html> <html> < ...

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

    参考博客:https://segmentfault.com/a/1190000016418021?utm_source=tag-newest

  6. JavaScript中数组去重的几种方法

    JavaScript中数组去重的几种方法 正常情况下,数据去重的工作一般都是由后端同事来完成的,但是前端也要掌握好处理数据的能力,万一去重的工作交给我们大前端处理,我们也不能怂呀.现在我总结了一些去重 ...

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

    js中数组去重的几种方法         1.遍历数组,一一比较,比较到相同的就删除后面的                 function unique(arr){                 ...

  8. JavaScript数组去重的7种方式

    1.利用额外数组 function unique(array) {    if (!Array.isArray(array)) return;     let newArray = [];    fo ...

  9. 关于数组去重的几种方法-------javascript描述

    第一种方法:借助json对象来实现,若json对象中无该属性则添加,否则不添加,最后返回json对象的属性,时间复杂度为O(n) function deleteArrayRepeat(arr) { v ...

随机推荐

  1. [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...

  2. js_面向对象

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  3. Python3实现火车票查询工具

    Python 实现火车票查询工具 一. 实验介绍 通过python3实现一个简单的命令行版本的火车票查询工具,用实际中的例子会更感兴趣,不管怎么样,既练习了又可以自己使用. 1.  知识点: Pyth ...

  4. <%@ page trimDirectiveWhitespaces="true" %>

    我们经常会在JSP页面上使用: <%@ page trimDirectiveWhitespaces="true" %> 这个命令可以使jsp输出的html时去除多余的空 ...

  5. MongoDB 学习笔记一: 配置

    下载MongoDB 下载地址:https://www.mongodb.com/download-center?jmp=nav#community 这里是在windows平台下安装MongoDB, 下载 ...

  6. php备份mysql的代码

    1. mydb.php //DB类2. backup.php //备份脚本3. restore.php //还原脚本 mydb.php <?class db{ var $linkid;var $ ...

  7. c# 保存数据到txt (追加)

    StringBuilder sb = new StringBuilder(); sb.AppendLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:s ...

  8. Date、Calender类及日期和字符串转换

    Calendar是一个抽象类,抽象类java.util.Calendar 不可以通过new来获取一个实例,可以通过类方法getinstance()获取此类型的一个通用的对象 ①用法: Calendar ...

  9. Dcloud HTML5 监听蓝牙设备 调用 原生安卓实现

    最近一直搞Dcloud ,这是HTML5版本的开发,打包时候,可以打包成 apk 和ipa 分别运行在安卓和ios 机器上面, 但是这里面的资料很少,遇到问题,之后只能自己钻研总结, 现在有这么一个需 ...

  10. android studio使用部分报错处理

    1.android studio 导入项目时Error:SSL peer shut down incorrectly 今天导入一个项目到studio,显示在下载一个一个1.1.0-rc4的东西. 过了 ...