数组去重之新老对比法

前两天说到数组,那么今天就说说数组一个很重要的应用——数组去重。随便在网上搜搜能搜出一堆数组去重的方法。

方法如此之多,最终小白会如何选择呢?

那么多数组去重,你用哪个?

小白

用短的

短的能理解吗?

小白

理解毛线,背一个就好了

现实比较残酷了,那么今天开始的陆续几天,我们一起分享一些数组去重的方法。当然了,与大部分方法不同的是,一句一句的告诉你为啥这样做。以后就不用背下来了,直接领会,轻松写出~

好啦!开始第一种!先看一张图:

根据沙老师很形象的表之后,觉得这个例子非常的合适,于是借用了。这是一个大家熟悉的场景,吃回转寿司。如果我们面前有一个空盘子,这时我们希望吃没吃过的,开始旋转转盘时,往下拿寿司,当发现自己的盘子里的和转过来的寿司一样时,就不拿了。按照这种思路,看代码。

首先,需要一个数组,作为一个老数组:

vararr= [3,5,2,6,8,5,7,2];

接着,需要一个空盘子,创建一个返回值为已经去重之后的数组函数

function newArray() {}

调用去重函数得到一个新的数组

console.log(newArray());

但是需要把老数组作为参数传给函数,在函数里应用。于是:

functionnewArray(arr) {}

console.log(newArray(arr));

既然调用函数之后得到一个新数组,那么最起码返回值要是新数组吧?所以再加一句:

functionnewArray(arr) {

//在函数中准备一个接新数组的盘子

//并给它老数组的第一个

varnewArrayValue= [arr[]];

//返回新数组的盘子,盘子里此时只有老数组的第一项

returnnewArrayValue;

}

console.log(newArray(arr));

接着让寿司台(老数组)转起来看,怎么转?在函数中进行for循环

//逐一看老数组里的东西

for(vari=1;i

//不光要看老数组,还要看盘子里(新数组)的东西

// 和老数组是不是一样

for(varj=;

j< newArrayValue.length;

j++){

//在这里要有一个判断的过程

}

}

分析一下判断过程,如果有一个老数组中的和新数组中的一样,就不看后面的了,因为都出现一样的就没有必要再看后面的了。所以这时候,不看自己的盘子里了,于是跳出内循环。

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

//跳出循环(不比了)

break;

}

那么还有另一种可能性,就是发现自己看了一遍盘子里,没发现有一样的寿司。这时候,就需要告诉大脑“拿过来!我要吃!”往数组里加东西用push方法,这个是上一篇文章提过的。

但是!有一个问题,比较和夹菜是两个不同的动作,虽然大脑很好用,动作很连贯,可我们要在程序中体现,就需要按步骤进行。

判断——> 先存储一个数据,用于告知手即将有要加菜

——> 再跳出本轮循环

这里,要存储一个叫做“是否”的数据,那么在程序中“是”,“否”,我们可以用布尔类型的值来操作。在哪加?在看完一遍老数组之后,创建一个变量,也就是在内层循环外先创建一个变量。

for(vari=1;i

//在看完一遍老数组之后,

// 创建一个push还是不push的变量

// 叫做有重复isRepeat,最开始定义为没有

varisRepeat=false;

//把新数组也遍历一遍

for(varj=;

j< newArrayValue.length;

j++) {

//开始逐一比较两个数组的值

//turu:说明又重复,走if里面

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

//能进这里了,说明肯定重复了

//所以给变量重新赋值true

isRepeat=true;

//跳出循环(同时不比了)

break;

}

}

}

这个时候将出现一个变量isRepeat,它的值是什么呢?只可能是true或者false。

false:代表没重复

true:代表又重复

接着把这个值传给手,让手夹菜或者不夹菜。

if(!isRepeat){

newArrayValue.push(arr[i]);

}

这里面有一个容易错的地方就是if(值)括号里应是true但是,能进去的是没重复,也就是此时isRepeat值为false,所以我们将这个变量!反值处理,变成true,这时候可以夹菜了。

所有代码:

//1.老数组

vararr= [3,5,2,6,8,5,7,2];

//2.创建一个返回值为已经去重之后的数组函数

functionnewArray(arr) {

//3.创建一个中转的变量承接新数组的内容

//5.数组的值等于老数组的第一位,

//这一位肯定不重复,并在外面加[]视为数组类型

varnewArrayValue= [arr[]];//[3]

//6.遍历arr数组,把每一个拿出来,但是不用拿第一个了

for(vari=1;i< arr.length;i++) {

//12.在看完一遍老数组之后,

//创建一个push还是不push的变量叫做有重复isRepeat,

//最开始定义为没有

varisRepeat=false;

//8.把新数组也遍历一遍

for(varj=;

j

j++) {

//9.开始逐一比较两个数组的值

//turu:说明又重复,走if里面

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

//13.能进这里了,说明肯定重复了

isRepeat=true;

//10.跳出循环(同时不比了)

break;

}

}

//7.把遍历出来的所有老数组中的元素push到新数组的最后面。

此时

/*

11.发现比与不比都走push,没意义。

所以,需要一个push还是不push的判断。

如果,跳出了就不push了

*/

//14.能进这里说明,没重复,

//但是isRepeat=false,所以加!

if(!isRepeat){

newArrayValue.push(arr[i]);

}

}

returnnewArrayValue;

}

//3.调用去重函数得到一个新的数组

console.log(newArray(arr));

考虑到,微信中代码会被截掉,所以换行了,大家拷贝之后自己格式化一下。

下期是《重的最后吃一个》敬请期待~

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

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180129G0XVWN00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券