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 相关文章推荐
js实现数组冒泡排序、快速排序原理
Mar 08 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
js精准的倒计时函数分享
Jun 29 Javascript
jQuery简单动画变换效果实例分析
Jul 04 Javascript
Three.js学习之文字形状及自定义形状
Aug 01 Javascript
Vue.js每天必学之数据双向绑定
Sep 05 Javascript
纯jQuery实现前端分页功能
Mar 23 jQuery
自带气泡提示的vue校验插件(vue-verify-pop)
Apr 07 Javascript
关于js中的鼠标事件总结
Jul 11 Javascript
jQuery实现使用sort方法对json数据排序的方法
Apr 17 jQuery
JS原型prototype和__proto__用法实例分析
Mar 14 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
Nov 02 Javascript
浅谈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
第十一节--重载
2006/11/16 PHP
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
深入PHP FTP类的详解
2013/06/13 PHP
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
js数组操作常用方法
2014/05/08 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
python3字符串输出常见面试题总结
2020/12/01 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
商务英语应届生自我鉴定
2013/12/08 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
超越自我演讲稿
2014/05/21 职场文书
无毒社区工作方案
2014/05/23 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
警示教育片观后感
2015/06/17 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
使用CSS实现音波加载效果
2023/05/07 HTML / CSS