每天一个小知识,快速回顾知识点,今天回顾-数组去重的方法

71 阅读2分钟

1.假设有一个数组,内部有许多重复的值(今天我们只考虑基本类型的值),需要将其重复的值去掉。

例如:

let arr=[1,1,2,2,3,3,4,4,5,6,7,'9',9]

方案一:利用Set数据结构

let newArr=Array.from(newSet(arr));//需要用Array.from将最后结果转化为数组,毕竟Set只是类数组<br>//console.log(newArr)   [1, 2, 3, 4, 5, 6, 7, '9', 9]`

方案二:利用Array.prototype.indexOf()

let newArr=arr.filter((item,index)=>arr.indexOf(item)===index)
//我们利用filter这个方法对数组中每一项值进行筛选,那么怎么筛选呢,就是找到数组中
//第一次出现的元素下标与当前循环时的index与相等时就筛选出去.
//例如遍历第一个元素时arr.indexOf(1)返回的是0,此时遍历的下标index正好也是0,所以就将1筛选出去啦,
//遍历第二个元素时arr.indexOf(1)返回的还是0,但是此时遍历的index下标是1,所以就不会筛选出去.

方案三:利用Array.prototype.reduce()

let newArr=arr.reduce((pre,next)=>pre.includes(next)?pre:pre.concat(next),[])
//初始值为空数组,也是迭代完成后的返回值,判断遍历的下一项在不在数组内,不在就进行添加,如果在就不做处理

方案四:双重循环去重

 const deleteRepeatVal = (arr) => {
        for (let i = 0, len = arr.length; i < len; i++) {
          for (let j = i + 1; j < len; j++) {
            if (arr[i] === arr[j]) {
              arr.splice(j, 1);
              j--;
              len--;
            }
          }
        }
        return arr;
      };//古老的方法

方案五:利用es6扩展运算结合Set

let newArr=[...new Set(arr)]//其实和方案一差不多,只是转化数组的方式不同罢了

方案六:遍历数组,将值作为对象的键进行判断

     function deleteRepeatVal(arr) {
        let obj = {};
        for (let i = 0; i < arr.length; i++) {
          if (obj[arr[i]]) {//如果对象的键有值,代表数组里的值重复了,需要将此项删除,并且将i进行--,因为数组长度减少了
            arr.splice(i, 1);
            i--;
            continue;
          }
          obj[arr[i]] = arr[i];//将值作为obj的键
        }

        return arr;
      }

好啦,今天就回顾这几个数组去重的方法啦,相信大家还有许多其他方法欢迎评论区进行讨论,最后留给大家思考题,今天我们只考虑了数值是基本类型的数组,如果有对象形式的数组又该怎么去重呢?