JavaScript数组删除重复项

如果你一直在乎别人的看法,你就毁了。 ——《荒蛮故事》。

看了realazy的《JavaScript 数组的uniq方法》,提供了几个删除数组条目中重复的条目的Array原型方法,我也给出我的新解:

1、Realazy的写法

Array.prototype.uniq = function() { 
    var resultArr = [], 
        returnArr = [], 
        origLen = this.length, 
        resultLen; 

    function include(arr, value) { 
        for (var i = 0, n = arr.length; i < n; ++i){ 
            if (arr[i] === value) { 
                return true; 
            } 
        } 
        return false; 
    } 

    resultArr.push(this[0]); 
    for (var i = 1; i < origLen; ++i) { 
        if (include(resultArr, this[i])) { 
            returnArr.push(this[i]); 
        } else { 
            resultArr.push(this[i]); 
        } 
    } 

    resultLen = resultArr.length; 
    this.length = resultLen; 
    for (var i = 0; i < resultLen; ++i){ 
        this[i] = resultArr[i]; 
    } 
    return returnArr; 
}

我稍作修改,避免返回的重复项数组中存在重复项,但思路不变。

Array.prototype.distinct = function(){
    var ret = [],
        resultArr = [],
        returnArr = [],
        i = 1,
        origLen = this.length,
        resultLen;

    function include(arr, value){
    for (var i=0, n=arr.length; i<n; ++i){
        if (arr[i] === value){
        return true;
        }
    }
        return false;
    }

    resultArr.push(this[0]);
    for (i; i<origLen; ++i){
        if (!include(resultArr, this[i])){
            resultArr.push(this[i]);
        } else {
            if (!include(returnArr, this[i])){
            returnArr.push(this[i]); 
            } 
        }
    }

    ret[0] = resultArr;
    ret[1] = returnArr;
    return ret;
}

2、能叔的写法

直接返回一个包含2个元素的数组,一个是删除重复项的新数组,一个是包含重复项的数组。
经测试这个方法比realazy给出的方法似乎还要快一些。

Array.prototype.distinct = function()   
{   
   var ret = [],
   resultArr = [],
   returnArr = [];
   var a = {};   
   for(var i=0; i<this.length; i++) {
    if(typeof a[this[i]] == "undefined") {
       a[this[i]] = false; //数组中只有一项
    }
    else{
       a[this[i]] = true;   //数组中有重复的项
    }
   }     
   for(var i in a) {
      resultArr[resultArr.length] = i; 
      if (a[i]) {
        returnArr[returnArr.length] = i; 
    }
   }
   ret[0] = resultArr;
   ret[1] = returnArr;
   return ret;   
}

3、其它写法

当然还有很多其它的写法,主要借助于Array原生方法:

  • 利用splice函数:

    Array.prototype.distinct_bt1 = function() {
    var ret = [];
       for (var i = 0; i < this.length; i++) 
       {
        for (var j = i+1; j < this.length;) {
         if (this[i] === this[j]) {
          ret.push(this.splice(j, 1)[0]);
         } else {
          j++;
         }
        }
       }
       return ret;
    }
    
  • 利用sort函数:

    Array.prototype.distinct_bt2=function(){ 
       this.sort(); 
       var ret = []; 
       for(var i=this.length-1;i>-1;i--) 
       { 
        if( this[i] != ret[ ret.length - 1 ] ) 
        ret.push(this[i]); 
       } 
       return ret; 
    }
    

缺点也很明显:

  1. distinct_bt1返回的重复项数组中存在重复项,而且执行效率不高。
  2. distinct_bt2对元数组进行了排序,似乎有点画蛇添足(破坏了数组的原始排序属性),但想法不错O(∩_∩)O~

欢迎关注我的个人微信公众号:能叔

能叔

猜你喜欢

转载自tomoya.iteye.com/blog/2346654