数组去重

今天工作遇到此问题,主要是根据对象某属性去除重复的。

数组根据对象属性去重

  • 1采用lodash的uniqBy方法
  • 2 reduce

1 采用lodash的uniqBy, uniqWith方法

let arr=[{x:1, quarter:4},{x:1, quarter:4},{x:1, quarter:4},{x:1, quarter:3}];
   _.uniqBy(arr, 'quarter');

  var arr=[{x:1, quarter:4},{x:11, quarter:4},{x:1, quarter:4},{x:1, quarter:3}];
 _.uniqWith(arr, function(item,next){return item.x==next.x&&item.quarter==next.quarter?true:false});

2 采用原生reduce方法

    //1
    var arr=[{x:1, quarter:4},{x:1, quarter:4},{x:1, quarter:4},{x:1, quarter:3}];
    var hash = {};
    arr.reduce(function(item, next) {
        hash[next.quarter] ? '' : hash[next. quarter] = true && item.push(next);
        return item
    }, [])


    //2
    var arr1=[{x:1, quarter:4},{x:1, quarter:4},{x:1, quarter:4},{x:1, quarter:3}];
var set = arr1.reduce(
  function(set, item) {
    set[item["quarter"]] = item;
    return set;
  },
  {}
);

Object.keys(set).map(function(key) { return set[key]; });    

3 利用set的不可重复性

数组去重

1 遍历循环

Array.prototype.method1 = function(){  
           var arr[];    //定义一个临时数组  
           for(var i = 0; i < this.length; i++){    //循环遍历当前数组  
               //判断当前数组下标为i的元素是否已经保存到临时数组  
               //如果已保存,则跳过,否则将此元素保存到临时数组中  
               if(arr1.indexOf(this[i]) == -1){  
                   arr.push(this[i]);  
               }  
           }  
           return arr;  
       }  

2 hash表

Array.prototype.method2 = function(){  
        var h{};    //定义一个hash表  
        var arr[];  //定义一个临时数组  

        for(var i = 0; i < this.length; i++){    //循环遍历当前数组  
            //对元素进行判断,看是否已经存在表中,如果存在则跳过,否则存入临时数组  
            if(!h[this[i]]){  
                //存入hash表  
                h[this[i]] = true;  
                //把当前数组元素存入到临时数组中  
                arr.push(this[i]);  
            }  
        }  
        return arr;  
    }      

3 循环遍历

Array.prototype.method3 = function(){  
           //直接定义结果数组  
           var arr[this[0]];  
           for(var i = 1; i < this.length; i++){    //从数组第二项开始循环遍历此数组  
               //对元素进行判断:  
               //如果数组当前元素在此数组中第一次出现的位置不是i  
               //那么我们可以判断第i项元素是重复的,否则直接存入结果数组  
               if(this.indexOf(this[i]) == i){  
                   arr.push(this[i]);  
               }  
           }  
           return arr;  

       }                      

4 先排序

Array.prototype.method4 = function(){  
       //将数组进行排序  
       this.sort();  
       //定义结果数组  
       var arr[this[0]];  
       for(var i = 1; i < this.length; i++){    //从数组第二项开始循环遍历数组  
           //判断相邻两个元素是否相等,如果相等说明数据重复,否则将元素写入结果数组  
           if(this[i] !== arr[arr.length - 1]){  
               arr.push(this[i]);  
           }              
       }  
       return arr;  

   }