利用实例方法实现数组去重(六种方法) 面试常问

大前提:创建一个随机数组,在此基础上实现数组去重

   function creatArr(length, min, max) {
        let arr = [];
        for (let i = 0; i < length; i++) {
          arr.push(~~(Math.random() * (max - min + 1) + min));
        }
        return arr;
      }

一:运用splice方法实现:数组去重(tip:直接修改原数组)

  1. splice():删除和增加数组元素 
  2. arr.splice(开始下标,删除的个数,新增元素1,新增元素2)
let arr1 = creatArr(8, 1, 10);
console.log(arr1);
let uniq = (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); //以j为下标的数组元素开始,删除一个数组元素
        //只有j++会漏判一位 解决这个问题就用j-- 减一个加一个下标不变 不会漏判,删除后所有数组元素下标往前移动一位
        j--;
    }
   }
}
return arr;
};
console.log(uniq(arr1));


二: 运用indexOf方法实现:数组去重(tip:新建空数组,返回新数组)

  1. indexOf()方法是从前往后查找数组元素,返回第一个符合条件的下标,如果找不到,返回-1
  2. arr.indexOf(数组元素,index)

难点:进入循环的条件:
      //在新数组中添加元素 要求元素不重复
      //如果元素重复不要进入循环 而进入循环的条件是元素不重复即在查找数组元素时,没有返回符合条件数组元素,就是要结果返回-1,因此返回-1的数组满足条件

let arr2 = creatArr(10, 1, 10);
console.log(arr2);
let noReapt = (arr) => {
let newArr = [];
    //遍历数组元素
    for (let i = 0; i < arr.length; i++) {
      //indexOf()方法是从前往后查找数组元素,返回第一个符合条件的下标,如果找不到,返回-1
      //在新数组中添加元素 要求元素不重复
      //如果元素重复不要进入循环 而进入循环的条件是元素不重复即在查找数组元素时,没有返回符合条件数组元素,就是要结果返回-1,因此返回-1的数组满足条件
      if (newArr.indexOf(arr[i]) === -1) {
            newArr.push(arr[i]);
      }
    }
     return newArr;
  };
console.log(noReapt(arr2));

三:运用includes方法实现数组去重

  1.  includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false
let arr3=creatArr(8,1,10)
console.log(arr3);
let onlyOne =(arr)=>{
let newArr2=[]
for (let i = 0; i < arr.length; i++) {
    //判读该数组是否包含某个数
    if (!newArr2.includes(arr[i])) {//新数组不包含就数组的某个数 也就是说新数组没有原数元素,则可以添加到新数组中(不重复),返回false ;如果包含原数组的元素了,就不能添加到组中去 
    newArr2.push(arr[i]);

    }
}
return newArr2;
}
console.log(onlyOne(arr3));

结果呈现如下:

 

四:运用sort方法实现数组去重

核心思路:

            1.给原数组排序

            2.比较原数组的第i项和第i+1项是否相等

            3.如果不相等添加到新数组中

            4.返回新数组

 function qc4(arr) {
        let newArr = [];
        arr = arr.sort((a, b) => a - b);

        for (let i = 0; i < arr.length; i++) {
          if (arr[i] !== arr[i + 1]) {
            newArr.push(arr[i]);
          }
        }
        return newArr;
      }
 let arr4 = [4, 14, 144, 2, 12, 14, 10, 1, 3, 14, 2, 3];
 console.log(qc4(arr4)); //(8) [1, 2, 3, 4, 10, 12, 14, 144]

五:运用对象的唯一key属性

核心思路:

      1.新建空对象和空数组

      2.遍历数组

      3.判断新对象是否包含某个属性

      4.如果包含什么也不做

      5.如果不包含 给对象设置属性 利用key具有唯一性,把新对象的所有数组,作为数组元素

      6.返回新数组

      function qc5(arr) {
        let newArr = [];
        let newObj = {};
        for (let i = 0; i < arr.length; i++) {
          //判断对象是否包含某个属性
          if (!newObj.hasOwnProperty(arr[i])) {
            //不包含 给对象设置属性
            newObj[arr[i]] = "1";
            //把对象唯一的属性作为数组元素
            newArr.push(arr[i]);
          }
        }
        return newArr;
      }

      let arr5 = [1, 2, 3, 45, 12, 13, 12, 5, 12, 3, 5, 8];
      console.log(qc5(arr5)); //(8) [1, 2, 3, 45, 12, 13, 5, 8]

六、利用ES6新增-Set结构

ES6新增的数据结构,类似数组,但是成员没有重复的值,只有唯一性Set是内置的构造函数

语法:let s = new Set ( 数组 | 类数组 )

 应用于数组去重:

      //set
      let arr6 = [1,2,3,1,2,3,4,5,6,5,7]
      let s1=new Set(arr6);
      console.log(s1);
      //对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中 
      //转换成数组
      console.log([...s1]);//(7) [1, 2, 3, 4, 5, 6, 7]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值