javascript数组去重小结


Posted in Javascript onMarch 07, 2016

前言

最近为了换工作,准备下面试,开始回顾复习JavaScript相关的知识,昨天下午想到了数组去重的相关方法,干脆整理出几篇JavaScript算法文章,以备后用,此系列文章不定篇数,不定时间,想到哪写到哪,不保证正确性,不保证高效率,只是谈谈个人理解,如有错误,请诸位斧正。

关于去重

数组去重是一个比较常见的算法考察点,实现去重的方式无外乎通过唯一性和非唯一性。简单来讲就是挑出唯一的或者删除不唯一的。以下所有算法都是我自己瞎命名的,请无视之。

循环匹配去重

顾名思义,就是把数组中的每一个元素都和存放元素的数组对比,遇到不重复的元素,放入新数组中,直至循环结束,由于匹配也有循环,也可以称为双循环匹配去重,这也是大家都能想到的最简单的方式。

实现代码:

var arr=[1,3,4,56,3,7,9,7];
var result=[];
//匹配
function isMatch(array,n){
  for(var i=0;i<array.length;i++){
    if(array[i]==n){
      return true;
    }
  }
  return false;
};
//验证所有元素
function unqiue(array){
  for(var i=0;i<array.length;i++){
    if(!isMatch(result,array[i])){
      result.push(array[i]);
    }
  }
  return result;
};

console.log(unqiue(arr));

注意:上面方法有一个bug,当存在数字和数字形式的字符串的时候,没有区分出数字和数字字符串。因为在匹配函数isMatch()里用的是双等“==”,没有验证元素类型,实际应该使用全等“===”。
修改后的代码如下:

var arr=[1,3,4,56,3,'1',7,9,7];
var result=[];
//匹配
function isMatch(array,n){
  for(var i=0;i<array.length;i++){
    if(array[i]===n){
      return true;
    }
  }
  return false;
};
//验证所有元素
function unqiue(array){
  for(var i=0;i<array.length;i++){
    if(!isMatch(result,array[i])){
      result.push(array[i]);
    }
  }
  return result;
};

console.log(unqiue(arr));

算法优缺点:

优点:

实现简单,思路直观

缺点:

效率低下

JSON去重/对象去重/字典去重

JSON去重,简单来讲就是利用Object对象key的唯一性,将数组的元素转换为JSON或者说对象的key值。JSON的value存储数组的索引index,然后对JSON对象进行for in循环,存储到新数组中。

Array、JSON、{}都是Object,所以采用任意一种都可以实现此算法。

实现代码:

Array方式:

var arr=[1,3,4,56,3,'1',7,9,7];
function unqiue(array){
  var cache=[];
  var result=[];
   //将数组元素转为对象的key
  for(var i=0;i<array.length;i++){
    cache[array[i]]=i;
  };
  
  //存储key(实际的数组元素)
  for(key in cache){
    result.push(key);
  };
  
  return result;
}
  
console.log(unqiue(arr));

JSON方式:

var arr=[1,3,4,56,3,'1',7,9,7];
function unqiue(array){
  var cache={};
  var result=[];
   //将数组元素转为对象的key
  for(var i=0;i<array.length;i++){
    cache[array[i]]=i;
  };
  
  //存储key(实际的数组元素)
  for(key in cache){
    result.push(key);
  };
  
  return result;
}
  
console.log(unqiue(arr));

Object方式:

var arr=[1,3,4,56,3,'1',7,9,7];
function unqiue(array){
  var cache=new Object();
  var result=[];
   //将数组元素转为对象的key
  for(var i=0;i<array.length;i++){
    cache[array[i]]=i;
  };
  
  //存储key(实际的数组元素)
  for(key in cache){
    result.push(key);
  };
  
  return result;
}
  
console.log(unqiue(arr));

算法优缺点:

优点:

简单

效率非常高

缺点:

1.改变了数组元素的类型()
2.有bug(无非区分数字和数字类型字符串)

队列递归去重

昨天晚上思忖良久想到用队列的方式,先将数组排序成升序或降序的队列,这样相同的元素就处在一个区域内,然后从队尾向前匹配,如果匹配成功,删除队尾,然后前一个元素再向其前面的匹配。整个匹配完成之后,剩下的元素就是去重过后的队列。

var arr=[6, 4, 6, 9, '6', 13, 56, 9, ,'11',1, 8, '7', 17, 5, 45, 3, 7];

function unqiue(array){
  //排序数组,形成队列
  array.sort(function(m,n){return m-n;});
  ////排序后,队尾向前对比,如果相同,删除队尾,依次类推
  function loop(Index){
    if(Index>=1){
      if(array[Index]===array[Index-1]){
        arr.splice(Index,1);
      }
      loop(Index-1);
    }
    
  }
  loop(array.length-1);
  return array;
}

console.log(unqiue(arr));

算法优缺点:

优点:

效率较高

缺点:

效率不是最高

INDEXOF去重方式

判断浏览器是否支持indexOf ,indexOf 为ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持

if (!Array.prototype.indexOf){ 
// 新增indexOf方法 
Array.prototype.indexOf = function(item){ 
var result = -1, a_item = null; 
if (this.length == 0){ 
return result; 
} 
for(var i = 0, len = this.length; i < len; i++){ 
a_item = this[i]; 
if (a_item === item){ 
result = i; 
break; 
} 
} 
return result; 
} 
}
Javascript 相关文章推荐
JavaScript访问CSS属性的几种方式介绍
Jul 21 Javascript
jQuery中的jQuery()方法用法分析
Dec 27 Javascript
javascript中typeof操作符和constucor属性检测
Feb 26 Javascript
JavaScript中的this关键字使用方法总结
Mar 13 Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 Javascript
Angular在一个页面中使用两个ng-app的方法
Feb 20 Javascript
微信小程序教程系列之新建页面(4)
Apr 17 Javascript
微信小程序switch组件使用详解
Jan 31 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
Jul 20 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
Jun 12 jQuery
JS实现提示框跟随鼠标移动
Aug 27 Javascript
vue+element树组件 实现树懒加载的过程详解
Oct 21 Javascript
详解JS正则replace的使用方法
Mar 06 #Javascript
浅谈javascript中的call、apply、bind
Mar 06 #Javascript
一波JavaScript日期判断脚本分享
Mar 06 #Javascript
Node.js程序中的本地文件操作用法小结
Mar 06 #Javascript
JavaScript实现数据类型的相互转换
Mar 06 #Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 #Javascript
javascript实现label标签跳出循环操作
Mar 06 #Javascript
You might like
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
YUI的Tab切换实现代码
2010/04/11 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
浅谈Python的文件类型
2016/05/30 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
python列表使用实现名字管理系统
2019/01/30 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
python爬取youtube视频的示例代码
2021/03/03 Python
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
周年庆典邀请函范文
2014/01/24 职场文书
创业资金计划书
2014/02/06 职场文书
二手房购房意向书范本
2014/04/01 职场文书
班主任班级寄语大全
2014/04/04 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
发展党员工作情况汇报
2014/10/28 职场文书