js最简单数组去重_js数组去重的几种方法

2ff34e647e2e3cdfd8dca593e17d9b0a.png

在工作中经常后台返回的数据,用户的输入==,都会有重复的数据的可能,所以,处理重复的数据是不可避免的,就总结一下数组的几种常见的去重方法

1.简单的去重方法

最简单的数组去重法

新建一新数组,遍历传入数组,值不在新数组就push进该数组中

IE8以下不支持数组的indexOf方法function uniq(array){

var temp = [];//一个新的临时数组

for(var i = 0; i < array.length; i++){

if(temp.indexOf(array[i] == -1)){

temp.push(array[i]);

}

}

return temp;

}

var aa = [1,2,2,3,4,3,4,5,6,7,8];

console.log(uniq(aa));

2.对象键值法去重

速度最快,占空间最多(空间换时间)

该方法执行的速度比其他任何方法都快,就是占用的内存大一些。

思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入数组。

注意点:判断是否为js对象键时,会自动对传入的键执行”toString()”,

不同的键可能会误认为一样,例如n[val] – n[1]、n[“1”];

解决上述问题还是得调用”indexOf”。function uniq(array){

var temp = {},r = [], len = array.length,val,type;

for(var i = 0; i < len; i++){

var array[i];

type = typeof val;

if(!temp[val]){

temp[val] = [type];

r.push(val);

}else if(temp[val].indexOf(type) < 0){

temp[val].push(type);

r.push(val);

}

}

return r;

}

var aa = [1,2,3,"3",4,9,"a",3,5];

console.log(uniq(aa));

3.排序后相邻去除法

给传入数组排序,排序后相同值相邻,

然后遍历时,新数组只加入不与前一值重复的值。

会打乱原来数组的顺序function uniq(array){

array.sort();

var temp = [array[0]];

for(var i = 0; i < array.length; i++){

if(array[i] !== temp[temp.length-1]){

temp.push(array[i]);

}

}

return temp;

}

var aa = [1,2,"2",4,9,"a",2,3,5,6];

console.log(uniq(aa));

4.数组下标法

还是得调用”indexOf”性能跟方法1差不多,

实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,

那么表示第i项是重复的,忽略掉。否则存入结果数组。function uniq(array){

var temp = [];

for(var i = 0;i < array.length;i++){

//如果当前数组的第i项在当前数组中第一次出现的位置是i,才存入数组,否则代表是重复的

if(array.indexOf(array[i] == i)){

temp.push(array[i]);

}

}

return temp;

}

var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];

console.log(uniq(aa));

5.优化遍历数组法

思路:获取没重复的最右一值放入新数组

(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)function uniq(array){

var temp = [],index = [];

var l = array.length;

for(var i = 0;i < l;i++){

for(var j = i+1; j < l;j++){

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

i++;

j = i;

}

}

temp.push(array[i]);

index.push(i);

}

console.log(index);

return temp;

}

var aa = [1,2,2,3,5,3,6,5];

console.log(uniq(aa));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值