数组去重之老老对比

其实不想写这个题目,但是觉得怕写《重复的后吃》有点太不着调了,所以还是规矩的些吧。

今天这种方法,挺有意思。一行代码确实研究了挺久怎么去解释,怎么能说明白。其中有一句确实不好理解,那么进入正题了。

先创建一个老数组,模式和昨天的一样,没看的希望大家也看看昨天的文章,顺便温故知新。

vararr= ['周一','周二','周三','周二','周一'];

接着,同样是拿一个空盘子来。空盘子了,什么都不放。

varnewAarry= [];

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

for(vari=;i

for(varj=i+1;j

}

}

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

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

for(vari=;i

for(varj=i+1;j

if(arr[i] ===arr[j]) {

//一样就在这里操作

}

}

//不一样就给新数组push

newAarry.push(arr[i]);

}

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

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

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

vara=1;

varb= ++a;

varb=a++;

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

for(vari=;i

for(varj=i+1;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(vari=;i

for(varj=i+1;j

if(arr[i] ===arr[j]) {

++i;

j=i;

//j=++i;可以简写

}

}

newAarry.push(arr[i]);

}

最终我们需要看看新数组就好了,整体代码整理之后法一下。

vararr= ['周一','周二','周三','周二','周一'];

varnewAarry= [];

for(vari=;i

for(varj=i+1;j

if(arr[i] ===arr[j]) {

++i;

j=i;

//j=++i;

}

}

newAarry.push(arr[i]);

}

console.log(newAarry);

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

本微信号所有内容为前端客用户原创,前端客已获得独家授权,欢迎分享。

如有转载需求请留言征询,对于未经许可私自篡改内容、转载的行为我们保留追究维权的合法权利!

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180130G14LWF00?refer=cp_1026

扫码关注云+社区