js数组去重复算法

1.速度最快算法:对象键值对法(占用空间最多,空间换时间)

在使用此方法去除数组重复的元素时,我们应该注意,当判断js对象键时,会自动的对传入的键执行‘’toString()”,因此,我们需要考虑数组中可能同时出现number类型和字符串类型的数据,在这时,不同的键可能会被认为是一样,比如:a[2]和a["2"]。因此,解决这个问题还得使用indexOf方法。

function unique(arr){
  var obj = {}, r = [], value, type;//f分别表示:键值对对象,存放过滤后数组,当前下标的数组值,数组值的数据类型
  for (var i = 0; i < arr.length; i++) {
    value= arr[i];//当前下标数组元素
    type = typeof value;//该数组元素的类型
    if (!obj[value]) {//在键值对中不存在该值
      obj[value] = [type];//不存在就把该键值对以value:[type]的形式存入obj
      r.push(value);//将该数组元素push到新数组中
    } else if (obj[value].indexOf(type) < 0) {//解决不同键可能被认为一样的问题 例如obj['1']与obj[1],在前面!obj[value]会被判断为一样,因为判断时value会自动调用toSting转换为字符串,因此需要这个判断
      obj[value].push(type);//将该值存入对应的value值的数组中
      r.push(value);
    }
  }
  return r;//返回去重复后的数组
}

测试代码:

 var a=[8,2,1,'3',3,5,4,5,4];
 console.log(unique(a));//[8,2,1,'3',3,5,4];

2.双重for循环,利用splice()方法去重复

在双重for循环中,外层循环元素,内层循环时比较值,如果值相同的时候,就用splice()方法去掉内层循环下标对应的值,然后再让内层循环的循环变量减减,以实现每个值都进行比较。

function unique2(arr){
    for(var i=0;i<arr.length;i++){//控制循环元素
        for(var j=i+1;j<arr.length;j++){//实现i和i+1后每个元素比较
            if(arr[i]===arr[j]){//判断第i个元素和第j个元素是否相等 ,注意:这里用===表示数组元素值和类型都得相等
                arr.splice(j,1);//去掉重复的元素
                j--;//索引下标减1,达到所有元素都进行比较了
            }
        }
   }
   return arr;//返回去重复后的数组
}

测试代码:

b = [1, 2, 1, '3', 5, 3,'true',true,1,2,true];
console.log(unique2(b))//[1,2,'3',5,3,'true',true];

3.利用indexOf()方法去重复

新创建一个空数组,然后用for循环原数组,依次判断循环的每一个元素是否在新数组中,如果新数组中已存在,则跳过,否则将该元素push到新数组中,最后返回这个新数组。

function unique3(arr){
    let array=[];//创建一个新数组
    for(var i=0;i<arr.length;i++){//遍历原数组
        if(array.indexOf(arr[i])==-1){//判断元素是否存在于array新数组中
            array.push(arr[i]);//将满足条件元素添加到新数组中
        }
    }
    return array;//返回新数组
}

测试代码:

var a = [1, 2, 1, '3', 5, 3,'true',true,1,2,true]
console.log(unique3(a))//[1,2,'3',5,3,'true',true];

4.利用sort()方法去重复  注意:这种方法只适用于纯数字(number)类型

首先利用sort()排序对原数组进行排序,然后创建一个新数组,再对排序后的数组进行遍历,对相邻的两个元素进行比较,如果相邻两个元素不相等,就将元素push进新数组中。

1)这是直接调用sort()方法,数组元素按字符串顺序对值进行排序后在去重复的形式

//这种方法是直接调用sort(),让数组按字符串顺序对值进行排序,输出结果不是安数字大小排序的
function unique4(arr){
    arr=arr.sort();//直接调用sort方法排序
    var array=[arr[0]];//将数组元素第一个添加到新数组中
    for(var i=1;i<arr.length;i++){//从数组的第二个元素开始遍历
        if(arr[i]!=arr[i-1]){//比较当前元素与前一个元素是否相等
            array.push(arr[i])//不等就把值push到新数组中
        }
    }
    return array;//返回新数组的值
}

测试代码:

var a = [1,3,43,5,6,74,5,1,2,3,4,5];
console.log(unique4(a)) //[1,2,3,4,43,5,6,74]

2)这是sort()方法调用了比值函数,对数组进行安数字大小升序排序后在去重复的形式

//这种方法会将数据先按数字大小的顺序升序排列,然后在判断,最后输出的结果会以升序排列
function unique4(arr){
    arr=arr.sort(function(a,b){return a-b});//sort调用比值函数,将数组按升序排列
    var array=[arr[0]];//将数组元素第一个添加到新数组中
    for(var i=1;i<arr.length;i++){//从数组的第二个元素开始遍历
        if(arr[i]!=arr[i-1]){//比较当前元素与前一个元素是否相等
            array.push(arr[i])//不等就把值push到新数组中
        }
    }
    return array;//返回新数组的值
}

测试代码:

 var a = [1,3,43,5,6,74,5,1,2,3,4,5];
 console.log(unique4(a))//[1,2,3,4,5,6,43,74]

这种方式不仅能去重复,还能将数组按升序排序。因此,如果数组是纯数字的时候,又希望数组去重复后结果按升序排序,可以用这种方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值