数组去重之删除和属性的方法

今天说两个,一个是采用前后对比,删除其中一个的方法,另一个是利用对象的属性不重复而保存元素的方法。

1

先看第一个:

先来一个数组

vararr= [2,3,21,4,2,5,3];

接着创建一个空数组

varnewAarry= [];

还是进行前后对比,前后对比依旧用双层for循环

//利用双层for循环,外层循环负责遍历前一个数

for(vari=;i

//内层负责,前一个的后一项

for(varj=i+1;j

//在这里关键

}

}

在内层for循环中,还是要进行前一个和后一个的比较

//如果前一个和后一个相等

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

//把后一项这一位数字删掉

arr.splice(j,1);

}

这就完了吗?还没有!现在我们删掉了数组中的其中一个,那数组长度就变了。可是我们还是会按照原来数组的长度去遍历。这样会出现错误,数组长度会越界。那怎么办?

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

arr.splice(j,1);

//数组长度减小了,防止越界

j--;

}

加上这句j--。每次发现一样的删除之后马上让j的减掉一个再遍历,不然肯定越界。

好了,完整代码附上:

vararr= [2,3,21,4,2,5,3];

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

varnewAarry= [];

//还是前后对比

//利用双层for循环,外层循环负责遍历前一个数

for(vari=;i

//内层负责,前一个的后一项

for(varj=i+1;j

//如果前一个和后一个相等

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

//把后一项这一位数字删掉

arr.splice(j,1);

//数组长度减小了,防止越界

j--;

}

}

}

2

再看第二个:

还是先来一个数组

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

接着创建一个空数组,同时创建一个空对象

varnewAarry= [];

varobj= {};

我们都知道,对象的属性不能一样。我能不能把数组中的值都作为对象中的一个属性呢?二话不说先循环

for(vari=;i

vart=arr[i];

//console.log(typeof arr[i]);//string

}

循环之后我们发现arr[i]它的数据类型是字符串类型,如果我们把字符串类型当作对象的属性是不能用 . 点来链接的。

用索引读取,索引是从0开始的。数组也是对象,对对象对的某个属性进行访问,可以使用[]或者. 这两种方式。但是属性名称是数字体现的,所以就要使用[]的方式。

在JavaScript中通常使用”."运算符来存取对象的属性的值。或者使用[]作为一个关联数组来存取对象的属性。但是这两种方式有什么区别了?

使用数组[]表示法来存取一个对象的属性时,属性名是用字符串表示的。

所以我们要用[]作为对象属性的链接。那么也不用去把这些都一步步搞出来,我们就把obj[t]也就是obj[arr[i]],拿出来看看它的布尔类型。

for(vari=;i

vart=arr[i];

//打印每一个obj[t]

//console.log(obj[t]);

//1.undefined == false

//2.undefined == false

//3.undefined == false

//前三个都是false也就是说前三个都没有重复的

//4.true

//没有重复的是false,如果在判断中需要加!

//进入了判断语句,就给它一个属性值true

if(!obj[t]) {

obj[t] =true;

//1.

//2.

//3.

//把属性名给新数组push进去

newArr.push(t);

}

}

好了两种方法喜欢哪个都可以试试,下周我们介绍ES5和ES6的方法。但是大家要注意的是,按照需求去选择方法。如果我们需要兼容低版本浏览器,就不可以用新方法。

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

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

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

扫码关注云+社区

领取腾讯云代金券