实现数组去重

本文介绍了多种数组去重的方法,包括使用indexOf、对象键值对、排序比较、ES6 Set等实现方式,并分析了每种方法的时间复杂度。
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));
715962-20180510193505930-1423414069.png
 复杂度为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 ];





**

转载于:https://www.cnblogs.com/moyuling/p/9021340.html

### 使用 `indexOf` 方法实现数组 对于基本数据类型的数组,可以通过 `indexOf` 来检测元素是否已存在于目标数组中。由于 `indexOf` 返回的是指定元素首次出现的位置索引;如果未找到则返回 `-1`。因此可以在遍历源数组的过程中利用这一特性筛选出唯一的元素。 ```javascript function unique(array) { let result = []; array.forEach(function(item) { if (result.indexOf(item) === -1) { result.push(item); } }); return result; } // 示例 let arr = [1, 2, 3, 2, 1]; console.log(unique(arr)); // 输出: [1, 2, 3] ``` 这种方法适用于简单类型的数据结构,如数字或字符串[^1]。 ### 利用 `filter` 和 `indexOf` 组合方式重复项 另一种常见的做法是借助于 `filter()` 函数配合 `indexOf()` 进行过滤操作。这种方式同样不会修改原数组,并且能够保持原有顺序不变。 ```javascript const uniqueWithFilter = (arr) => arr.filter((item, index, self) => self.indexOf(item) === index ); // 测试例子 console.log(uniqueWithFilter([1, 'a', 'b', 'a', 2, 2])); // 结果为 [1, "a", "b", 2] ``` 此代码片段展示了如何结合 `filter()` 和 `indexOf()` 达成相同的效果——移除数组内的冗余条目[^3]。 ### 注意事项 需要注意的是上述两种方案都只适合处理简单的基础类型(比如整数、浮点数或者短字符)。当涉及到复杂对象比较时,则需采用其他策略来进行深拷贝对比或是自定义相等性判定逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值