ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数组去重方法集锦(一)

2022-02-08 11:07:37  阅读:163  来源: 互联网

标签:arr 集锦 ++ push length 循环 数组 var 方法


前两天写了一篇去重的方法,虽然都是自己公众号的老文章,但觉得总有需要的人,想在网络的浩瀚海洋中找到自己需要的东西,当然是非常高兴。有时间,有机会把自己知道的拿出来分享,觉得有需要的自然会有所得,即使被说成“电话拨号”也无所谓。

言归正传,数组去重我分成三个部分ES3、ES5、ES6,本篇介绍ES3中的一个方法。

先创建一个老数组,接着,同样是拿一个空盘子来。空盘子了,什么都不放。

var arr = ['周一', '周二', '周三', '周二', '周一'];
var newAarry = [];

接下来还是循环的看,这次和昨天的不同,昨天的是看老数组和新数组的相同元素,今天是只看老数组,前面一项和紧挨着它的后面一项是不是重复。那么看两项还是双层for循环,不一样的是,内层循环的初始值,是外层循环的i+1。为什么是+1,下一项的索引当然是+1啦!

for (var i = 0; i < arr.length; i++) {
  for (var j = i + 1; j < arr.length; j++){    
  }
}

现在循环了,人后怎么办呢?这时候我们有两个值,一个是arr[i]一个是arr[j],它们的关系是每一个值和它后面元素的关系。那么如果它们两个值一样的话说明了,有重复。

所以这时候需要一个判断,判断正在比较的这两个值是不是一样的。于是还是if语句。

for (var i = 0; i < arr.length; i++) {
  for (var j = i + 1; j < arr.length; j++){    
    if (arr[i] === arr[j]) {
    //一样就在这里操作
    }
  }
  //不一样就给新数组push
  newAarry.push(arr[i]);
}

难点不在给新数组push,而在判断内的操作。如果发现相同了:

1.我需要“放过”这次循环,不做任何操作,尤其是不push

2.此时,循环还在内层于是我将外层的i直接变成下一次,也就是++的操作

var a = 1;
var b = ++a;
var b = a++;

在这里举例,++a 和a++是不一样的。++a是先给a+1之后赋值给b,而a++则是先给b赋值a,然后a再++。

for (var i = 0; i < arr.length; i++) {
  for (var j = i + 1; j < arr.length; j++){    
    if (arr[i] === arr[j]) {
      ++i;//改了这里
    }
  }
  newAarry.push(arr[i]);
}

所以如果发现相等,我马上进行“放过”操作,也就是++i。可是我们都知道,这个时候还在内层循环中。内层for循环的j还在按部就班的运行着,突然,i就变了,那么i+1也就跟着变了,j运行到更新操作j++的时候一下就会多跳过一个元素没比。

那么我再把j拉回来既可以了,可我没办法改变for循环中j++的更新语句。可我能改变j的值呀!j=i 这时j的值就变的和i一样了,这时候还在内层for循环中的倒数第二步,当我进行完这步之后,马上就要j++了,就相当于拉回两步近一步,最后j还是会和i错后一位的。

for (var i = 0; i < arr.length; i++) {
  for (var j = i + 1; j < arr.length; j++){    
    if (arr[i] === arr[j]) {
      ++i;
      j=i;
      //j=++i;可以简写
    }
  }
  newAarry.push(arr[i]);
}

上张思路图,请忽略字体的凌乱,其实字我是可以好好写的。

 那么也希望大家能关注我我都公众号web-jianma,手机浏览随时随地~

标签:arr,集锦,++,push,length,循环,数组,var,方法
来源: https://blog.csdn.net/m0_66761375/article/details/122819822

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有