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脚本
Dec 03 Javascript
jQuery对象和DOM对象相互转化
Apr 24 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
Feb 25 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
jQuery图片轮播功能实例代码
Jan 29 Javascript
详解tween.js 中文使用指南
Jan 05 Javascript
vue iView 上传组件之手动上传功能
Mar 16 Javascript
使用 vue-i18n 切换中英文效果
May 23 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
Jul 05 Javascript
JS选取DOM元素常见操作方法实例分析
Dec 10 Javascript
vue实现在线翻译功能
Sep 27 Javascript
Node配合WebSocket做多文件下载以及进度回传
Nov 07 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
介绍一些PHP判断变量的函数
2012/04/24 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
php生成静态页面的简单示例
2014/04/17 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
php自动载入类用法实例分析
2016/06/24 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
大专自我鉴定范文
2013/10/01 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
高老头读书笔记
2015/06/30 职场文书