js数组去重的方法汇总


Posted in Javascript onJuly 29, 2015

三种方法

利用indexOf判断新数组

underscore.js中实际上也是使用的类似的indexOf

//传入数组
 function unique1(arr){
  var tmpArr = [];
  for(var i=0; i<arr.length; i++){
   //如果当前数组的第i已经保存进了临时数组,那么跳过,
   //否则把当前项push到临时数组里面
   if(tmpArr.indexOf(arr[i]) == -1){
    tmpArr.push(arr[i]);
   }
  }
  return tmpArr;
 }

利用indexOf判断旧数组

function unique2(arr){
  var tmpArr = []; //结果数组
  for(var i=0; i<arr.length; i++){
   //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
   //那么表示第i项是重复的,忽略掉。否则存入结果数组
   if(arr.indexOf(arr[i]) == i){
    tmpArr.push(arr[i]);
   }
  }
  return tmpArr;
 }

利用hash查找

这里利用了JS对象的实现就是hash表的特性

function unique3(arr){
  var tmpArr = [], hash = {};//hash为hash表
  for(var i=0;i<arr.length;i++){
   if(!hash[arr[i]]){//如果hash表中没有当前项
    hash[arr[i]] = true;//存入hash表
    tmpArr.push(arr[i]);//存入临时数组
   }
  }
  return tmpArr;
 }

数组扩展

Array.prototype.unique1 = function (){
  var tmpArr = []; 
  for (var i = 0; i < this.length; i++){
   if (tmpArr.indexOf(this[i]) == -1){
    tmpArr.push(this[i]);
   }
  }
  return tmpArr;
 }

 Array.prototype.unique2 = function(){
   var tmpArr = []; //结果数组
   for(var i = 0; i < this.length; i++){
    if (this.indexOf(this[i]) == i){
     tmpArr.push(this[i]);
    }
   }
   return tmpArr;
 }

 Array.prototype.unique3 = function(){
   var tmpArr=[], hash = {};
   for(var i = 0; i < this.length; i++){
    if (!hash[this[i]]){
      hash[this[i]] = true; 
      tmpArr.push(this[i]); 
    }
   }
   return tmpArr;
 }

使用Set

Set和Map是ES6中新增的数据结构
Set直接可以存储不重复的一组key,这个key也可以是对象,字符串等
创建set

var s = new Set([1, 2, 3,]);
s; // Set {1, 2, 3}

新增元素

>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}//重复元素不会被添加

删除元素

s; // Set {1, 2, 3, 4}
s.delete(3);
s; // Set {1, 2, 4}

遍历元素

Map和Set无法使用下标
ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型

var s = new Set(['A', 'B', 'C']);

for (var x of s) { // 遍历Set
  alert(x);
}

或者直接使用iterable内置的forEach方法
forEach方法是ES5.1标准引入的

var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, set) {
  alert(element);
});

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
javascript网页关闭时提醒效果脚本
Oct 22 Javascript
ExtJS 2.0实用简明教程 之Ext类库简介
Apr 29 Javascript
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
Nov 12 Javascript
apycom出品的jQuery精美菜单破解方法
Feb 18 Javascript
一些实用的jQuery代码片段收集
Jul 12 Javascript
搭建pomelo 开发环境
Jun 24 Javascript
javascript实现检验的各种规则
Jul 31 Javascript
JScript实现地址选择功能
Aug 15 Javascript
react router 4.0以上的路由应用详解
Sep 21 Javascript
JS实现的类似微信聊天效果示例
Jan 29 Javascript
vue动态子组件的两种实现方式
Sep 01 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
Dec 07 Vue.js
浅谈JavaScript的Polymer框架中的behaviors对象
Jul 29 #Javascript
JavaScript中的cacheStorage使用详解
Jul 29 #Javascript
JavaScript中数组继承的简单示例
Jul 29 #Javascript
小议JavaScript中Generator和Iterator的使用
Jul 29 #Javascript
浅析Node.js的Stream模块中的Readable对象
Jul 29 #Javascript
浅谈Javascript数组的使用
Jul 29 #Javascript
举例讲解Node.js中的Writable对象
Jul 29 #Javascript
You might like
重料打造自己的“宝马”---第三代
2021/03/02 无线电
初探PHP5
2006/10/09 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
2015/02/15 PHP
解决nginx不支持thinkphp中pathinfo的问题
2015/07/21 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
Javascript 解疑
2009/11/11 Javascript
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
js style动态设置table高度
2014/10/21 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
react的hooks的用法详解
2020/10/12 Javascript
python使用Matplotlib画条形图
2020/03/25 Python
Django用户认证系统 Web请求中的认证解析
2019/08/02 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
EJB的角色和三个对象
2015/12/31 面试题
大学生自我鉴定
2013/12/16 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL