您现在的位置: 365建站网 > 365文章 > javascript数组去重复方法分析

javascript数组去重复方法分析

文章来源:365jz.com     点击数:272    更新时间:2017-08-11 13:45   参与评论

本文实例讲述了javascript数组去重方法。分享给大家供大家参考,具体如下:

第一种是比较常规的方法

思路:

1.构建一个新的数组存放结果

2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比

3.若结果数组中没有该元素,则存到结果数组中

</>code

  1. Array.prototype.unique1 = function(){
  2.  var res = [this[0]];
  3.  for(var i = 1; i < this.length; i++){
  4.   var repeat = false;
  5.   for(var j = 0; j < res.length; j++){
  6.    if(this[i] == res[j]){
  7.     repeat = true;
  8.     break;
  9.    }
  10.   }
  11.   if(!repeat){
  12.    res.push(this[i]);
  13.   }
  14.  }
  15.  return res;
  16. }
  17. var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]
  18. alert(arr.unique1());

第二种方法比上面的方法效率要高

 

思路:

1.先将原数组进行排序

2.检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置

3.如果不相同,则将该元素存入结果数组中

</>code

  1. Array.prototype.unique2 = function(){
  2.  this.sort(); //先排序
  3.  var res = [this[0]];
  4.  for(var i = 1; i < this.length; i++){
  5.   if(this[i] !== res[res.length - 1]){
  6.    res.push(this[i]);
  7.   }
  8.  }
  9.  return res;
  10. }
  11. var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]
  12. alert(arr.unique2());

第二种方法也会有一定的局限性,因为在去重前进行了排序,所以最后返回的去重结果也是排序后的。如果要求不改变数组的顺序去重,那这种方法便不可取了。

 

第三种方法(推荐使用)

思路:

1.创建一个新的数组存放结果

2.创建一个空对象

3.for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中。

说明:至于如何对比,就是每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复。

</>code

  1. Array.prototype.unique3 = function(){
  2.  var res = [];
  3.  var json = {};
  4.  for(var i = 0; i < this.length; i++){
  5.   if(!json[this[i]]){
  6.    res.push(this[i]);
  7.    json[this[i]] = 1;
  8.   }
  9.  }
  10.  return res;
  11. }

 

var arr = [112,112,34,'你好',112,112,34,'你好','str','str1']; alert(arr.unique3());


其它文章收集:js数组去重的5种算法实现

1.遍历数组法
最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下:

</>code

  1. // 最简单数组去重法
  2. function unique1(array){
  3. var n = []; //一个新的临时数组
  4. //遍历当前数组
  5. for(var i = 0; i < array.length; i++){
  6. //如果当前数组的第i已经保存进了临时数组,那么跳过,
  7. //否则把当前项push到临时数组里面
  8. if (n.indexOf(array[i]) == -1) n.push(array[i]);
  9. }
  10. return n;
  11. }

2.对象键值对法
该方法执行的速度比其他任何方法都快, 就是占用的内存大一些,实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意 点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。

</>code

  1. // 速度最快, 占空间最多(空间换时间)
  2. function unique2(array){
  3. var n = {}, r = [], len = array.length, val, type;
  4. for (var i = 0; i < array.length; i++) {
  5. val = array[i];
  6. type = typeof val;
  7. if (!n[val]) {
  8. n[val] = [type];
  9. r.push(val);
  10. } else if (n[val].indexOf(type) < 0) {
  11. n[val].push(type);
  12. r.push(val);
  13. }
  14. }
  15. return r;
  16. }

3.数组下标判断法
还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。

</>code

  1. function unique3(array){
  2. var n = [array[0]]; //结果数组
  3. //从第二项开始遍历
  4. for(var i = 1; i < array.length; i++) {
  5. //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
  6. //那么表示第i项是重复的,忽略掉。否则存入结果数组
  7. if (array.indexOf(array[i]) == i) n.push(array[i]);
  8. }
  9. return n;
  10. }

4.排序后相邻去除法
虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。

</>code

  1. // 将相同的值相邻,然后遍历去除重复值
  2. function unique4(array){
  3. array.sort();
  4. var re=[array[0]];
  5. for(var i = 1; i < array.length; i++){
  6. if( array[i] !== re[re.length-1]){
  7. re.push(array[i]);
  8. }
  9. }
  10. return re;
  11. }

5.优化遍历数组法
该方法的实现代码相当酷炫,实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)推荐

</>code

  1. // 思路:获取没重复的最右一值放入新数组
  2. function unique5(array){
  3. var r = [];
  4. for(var i = 0, l = array.length; i < l; i++) {
  5. for(var j = i + 1; j < l; j++)
  6. if (array[i] === array[j]) j = ++i;
  7. r.push(array[i]);
  8. }
  9. return r;
  10. }

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

</>code

  1. if (!Array.prototype.indexOf){
  2. // 新增indexOf方法
  3. Array.prototype.indexOf = function(item){
  4. var result = -1, a_item = null;
  5. if (this.length == 0){
  6. return result;
  7. }
  8. for(var i = 0, len = this.length; i < len; i++){
  9. a_item = this[i];
  10. if (a_item === item){
  11. result = i;
  12. break;
  13. }
  14. }
  15. return result;
  16. }
  17. }

以上就是为大家提供的5种JS数组去重的算法实现,希望对大家的学习有所帮助。
 

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (272人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号