javascript数组去重小结
来源: 阅读:747 次 日期:2016-07-22 16:23:59
温馨提示: 小编为您整理了“javascript数组去重小结”,方便广大网友查阅!

本文给大家汇总介绍了javascript中数组去重的4种方法,分别是循环匹配去重,JSON去重/对象去重/字典去重,队列递归去重,INDEXOF去重方式,非常的细致全面,有需要的小伙伴可以参考下。

前言

最近为了换工作,准备下面试,开始回顾复习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数组去重小结
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map