实现数组去重

01,数组去重。
将数组里面重复的元素去掉。
var arr = ["mo","yu","mo"];
变为
arr = ["mo","yu"];

02,要求:
一个函数,输入原数组,返回新数组。原数组不变。


03,利用indexOf
思路:在新数组里是否已经存在了。

let arr = ["mo","yu","mo",1,5,1,78];

function unique(arr){
    let brr =[],len=arr.length;
    
    for(let i=0;i<len;i++){
        if(brr.indexOf(arr[i])== -1){
            //魔芋:在brr中没有找到,就插入brr中。
            brr.push(arr[i]);
        }
    }
    return brr;
}

console.log(arr,unique(arr));
 复杂度为o(n);//我猜测的。



04,利用对象的键值对。已存在的属性值设置为true。

function unique(arr){
    let brr =[],len=arr.length;

    let obj = {};    for(let i=0;i<len;i++){
        if(!obj[arr[i]]){
            /*
            * 魔芋:将数组元素作为obj对象的属性。然后设置该属性值为true。
            * 通过给对象属性值,取反,跳过插入新数组的操作。
            * */
            obj[arr[i]]=true;
            brr.push(arr[i]);
        }
       
    }
    return brr;
}


魔芋:问题,无法区分1和“1”;
修改如下:
unction unique(arr) {
  var ret = []
  var hash = {}
  for (var i = 0; i < arr.length; i++) {
    var item = arr[i]
    var key = typeof(item) + item;
    if (hash[key] !== 1) {
      ret.push(item)
      hash[key] = 1
    }
  }
  return ret;
}

对下面这种输入就无法判断:

      
      
unique ( [ new String ( 1 ) , new Number ( 1 ) ] )




05,原数组的indexOf()并不和i相等。
function unique(arr){
    let brr =[],len=arr.length;

 
        if(arr.indexOf(arr[i])== i){

            //魔芋:如果在原数组存在过,那么它的indexOf并不等于i;

            brr.push(arr[i]);
        }
    }


    return brr;
}

06,先把数组排序,然后重复的元素必定相邻。然后重复的项跳过。
function unique(arr){
    let brr =[],len=arr.length;

    arr.sort();
    
    brr.push(arr[0]);

    for(let i=0;i<len;i++){
        if(brr[i]!== arr[i+1]){
            
            brr.push(arr[i]);
        }
    }
    
    return brr;
}

07,双层for循环。让原数组的每个元素与原数组对比。如果存在就删除。复杂度为o(n^2)
function unique(arr){
    
    for(let i=0;i<arr.length;i++){
       for(let j =i+1;j<arr.length;j++){
           if(arr[i]===arr[j]){
               arr.splice(j,1);
           }
       }
    }
    
    return arr;
}


08,用ES6方法


 // 返回去重后的数组
 const numbers = [1, 2, 1, 1, 2, 1, 3, 4, 1 ];
 const uniq = [...new Set(numbers)] //  [ 1, 2, 3, 4 ];
 const uniq2 = Array.from(new Set(numbers)) // [ 1, 2, 3, 4 ];





**

猜你喜欢

转载自www.cnblogs.com/moyuling/p/9021340.html