数组去重

301 阅读2分钟

1.参考

  • 1、利用 ES6的set 方法。
let unique = arr => Array.from(new Set(arr))
let unique = arr => [...new Set(arr)]

  • 2、通过判断索引indexOf

    • 2.1 索引不是第一个索引,说明是重复值
    let unique = arr => arr.filter((item, index) => arr.indexOf(item) === index)
    
  • 3、新建一个数组,判断新数组中是否有某个值,如果没有就push,具体判断方法有:

    • 3.1通过indexOf查找,如果找不到就返回-1,找到就返回下标。
        let unique = arr =>  {
        var newArr = [];
        arr.forEach(item => { 
            if(newArr.indexOf(item) === -1) newArr.push(item)
        });
        return newArr;
    }
    
    • 3.2通过lastIndexOf反向查找 ,lastIndexOf从后往前查,返回的下标(index)是从前往后排序的(和indexOf一样),如果有数组中有相同元素,则是先返回最后边的一个位置。
    function unique9(arr){
     var res = []; 
     for(var i=0; i<arr.length; i++){
      res.lastIndexOf(arr[i]) !== -1 ? '' : res.push(arr[i]);
     }
     return res;
    }
    console.log(unique9([1,1,2,3,5,3,1,5,6,7,4]));
    
    • 3.3先排序,检查相邻元素是否相等,如果不相同就往新数组中push。
    let unique = arr =>  {
        var newArr = [];    
        arr.sort();
        arr.forEach((item, index) => {
            if( arr[index] !== arr[index+1]){
                newArr.push(arr[i]);
            }
        })
        return newArr;
    }
    
    • 3.4 forEach遍历,用数组原型对象上的includes方法判断新数组中是否有某个值,如果没有就push。
    function unique7(arr){
         var res = [];
         arr.forEach(function(item){
          res.includes(item) ? '' : res.push(item);
         }); 
         return res;
        }
        
        console.log(unique7([1,1,2,3,5,3,1,5,6,7,4]));
    
    • 3.5 for循环和includes结合,如果不包含就push。
    function unique5(arr){
     var res = [];
     for(var i=0; i<arr.length; i++){
      if( !res.includes(arr[i]) ){ // 如果res新数组包含当前循环item
       res.push(arr[i]);
      }
     }
     return res;
    }
    console.log(unique5([1,1,2,3,5,3,1,5,6,7,4]));
    
    • 3.6 用filter方法 判断新数组中是否有某个值,如果没有就push。
    function unique6(arr){
     var res = [];
     res = arr.filter(function(item){
      return res.includes(item) ? '' : res.push(item);
     });
     return res;
    }
    console.log(unique6([1,1,2,3,5,3,1,5,6,7,4]));
    
  • 4,利用数组原型对象上的 splice 方法。 *

    function unique8(arr){
         var i,
          j,
          len = arr.length; 
         for(i = 0; i < len; i++){
          for(j = i + 1; j < len; j++){
           if(arr[i] == arr[j]){
            arr.splice(j,1);
            len--;
            j--;
           }
          }
         }
         return arr;
        }
        console.log(unique8([1,1,2,3,5,3,1,5,6,7,4]));
    
  • 5,利用对象属性存在的特性,如果没有该属性则存入新数组。

    function unique3(arr){
     var res = [];
     var obj = {};
     for(var i=0; i<arr.length; i++){
      if( !obj[arr[i]] ){
       obj[arr[i]] = 1; //顺便给个属性值
       res.push(arr[i]);
      }
     } 
     return res;
    }
    console.log(unique3([1,1,2,3,5,3,1,5,6,7,4]));
  • 嵌套循环,定义一个Boolean值,如果不相同,定义为true,如果true就push。
function unique(arr){
    var res = [arr[0]];
    for(var i=1; i<arr.length; i++){
     var repeat = false;
     for(var j=0; j<res.length; j++){
      if(arr[i] === res[j]){
       repeat = true;
       break;
      }
     }
     if(!repeat){
      res.push(arr[i]);
     }
    }
    return res;
   }
   console.log(unique([1,1,2,3,5,3,1,5,6,7,4]));