JS数组去重和排序方法总结

一、去重

  1. 第一种是比较常规的方法
    思路:

    • 构建一个新的数组存放结果
    • for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比
    • 若结果数组中没有该元素,则存到结果数组中
      代码如下:
Array.prototype.unique1 = function(){
 var res = [this[0]];
 for(var i = 1; i < this.length; i++){
  var repeat = false;
  for(var j = 0; j < res.length; j++){
   if(this[i] == res[j]){
    repeat = true;
    break;
   }
  }
  if(!repeat){
   res.push(this[i]);
  }
 }
 return res;
}
var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]
alert(arr.unique1());

2.第二种方法比上面的方法效率要高

思路:

  • 先将原数组进行排序

  • 检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置

  • 如果不相同,则将该元素存入结果数组中
    复制代码 代码如下:

Array.prototype.unique2 = function(){
 this.sort(); //先排序
 var res = [this[0]];
 for(var i = 1; i < this.length; i++){
  if(this[i] !== res[res.length - 1]){
   res.push(this[i]);
  }
 }
 return res;
}
var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]
alert(arr.unique2());

第二种方法也会有一定的局限性,因为在去重前进行了排序,所以最后返回的去重结果也是排序后的。如果要求不改变数组的顺序去重,那这种方法便不可取了。

3.第三种方法(推荐使用)

思路:

  • 创建一个新的数组存放结果

  • 创建一个空对象

  • for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中。

说明:至于如何对比,就是每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复。
复制代码 代码如下:

Array.prototype.unique3 = function(){
 var res = [];
 var json = {};
 for(var i = 0; i < this.length; i++){
  if(!json[this[i]]){
   res.push(this[i]);
   json[this[i]] = 1;
  }
 }
 return res;
}


var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];
alert(arr.unique3());

二、排序

console.log("------默认排序(ASCII字符排序)------");  
var arr = [1,2,55,12,88];  
arr.sort();  //ASCII字符代码从小到大排序  
console.log(arr.toString());  


console.log("------自定义函数排序------");  
var arr1 = [1,2,55,12,88];  
arr1.sort(function(a,b){  //自定义函数排序  
    var a1= parseInt(a);  
    var b1= parseInt(b);  
    if(a1<b1){  
        return -1;  
    }else if(a1>b1){  
        return 1;  
    }  
    return 0;  
});  
console.log(arr1.toString());  


console.log("------反转数组------");  
var reArr = arr1.reverse();  //将数组中元素的顺序倒转  
console.log(reArr.toString());  


console.log("------按年龄正序排序------");  
var arr2 = [];  
arr2.push({date:"20130101",name:"lee",age:2});  
arr2.push({date:"20130101",name:"wang",age:12});  
arr2.push({date:"20130202",name:"huang",age:30});  
arr2.push({date:"20130202",name:"keke1",age:14});  
arr2.push({date:"20130202",name:"keke2",age:31});  
arr2.push({date:"20130303",name:"keke3",age:56});  
arr2.push({date:"20130303",name:"keke4",age:22});  
arr2.push({date:"20130303",name:"keke5",age:32});  
arr2.sort(function(a,b){  
    if(a.age<b.age){  
        return -1;  
    }else if(a.age>b.age){  
        return 1;  
    }  
    return 0;  
});  
for(var i=0;i<arr2.length;i++){  
    console.log(arr2[i].date + ", " + arr2[i].name + ", " + arr2[i].age);  
}  

console.log("------按date倒序,age正序排序------");  
arr2.sort(function(a,b){  
    if(a.date<b.date){  
        return 1;  
    }else if(a.date>b.date){  
        return -1;  
    }else{  
        if(a.age<b.age){  
            return -1;  
        }else if(a.age>b.age){  
            return 1;  
        }  
        return 0;  
    }  
});  
for(var i=0;i<arr2.length;i++){  
    console.log(arr2[i].date + ", " + arr2[i].name + ", " + arr2[i].age);  
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值