数组去重的多种方法

1、数组去重可以使用filter,去掉数组的重复项

例如

let arr = [1,2,2,3,4,5,6,null,null].filter((item,index,arr) => arr.indexOf(item)===index)

console.log(arr)

对filter延伸

一、作用

filter用于对数组进行过滤。

它创建一个新数组,新数组中的元素是通过检查指定数组中符合条件的所有元素

filter()不会对空数组进行检测、不会改变原始数组

二、语法

Array.filter(function(currentValue,index,arr){return{}})

 2、使用new Set 去重更简单

let arr = [...new Set([1, 2, 2, 4, null, null])]

console.log(arr)

 

 new Set() 的延伸

Set是es6 新增的数据结构,似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合。Set本身是一个构造函数,用来生成Set数据结构

new Set()生成出来的数据是Set数据结构,需要自行转换成对应结构

可以用于数组去重

也可以用于字符串去重

字符串去重

 .new Set方法,返回是一个类数组,需要结合 Array.from ,转成真实数组

3、reduce 其实也可以实现去重

  const arr = [{
  id: 1,
  phone: 1880001,
  name: 'wang',
  },{
  id: 2,
  phone: 1880002,
  name: 'li',
  },{
  id: 3,
  phone: 1880001,
  name: 'wang',
}]

let hash = {};
    return arr.reduce((totalItem, currItem) => {
      hash[currItem.phone]? null : hash[currItem.phone] = true && totalItem.push(currItem);
        return totalItem;  
    }, []);

主要思路是利用数组的去重中对象的不重名属性
首先弄一个空对象hash, 然后把对象的属性phone当做hash的key来用
第一次执行先把初始值[]传进去,所以此时totalItem是[],判断hash[currItem.phone]存不存在,第一次肯定不存在,所以把currItem.phone作为hash的一个属性,并赋值为true或把它的值赋值,并执行totalItem.push(currItem)及[].push(currItem),后面的判断同理,检查hash中的currItem.phone,存在就为null什么都不操作,不存在说明totalItem中也不存在,所以赋值并push即可;

reduce在上篇的文章中已做了详细介绍,这里不做过多解释

 4、for + object。利用对象属性名不能重复这一特点。如果对象中不存在,就可以给 push 进去

var arr = [1,2,3,4,3,2,3]
    // 数组去重:
    // 方法8 :for + obj
    function newArrFn (arr) {
      // 利用对象属性名不能重复这一特点
      // 如果对象中不存在,就可以给 push 进去
      let newArr = []
      let obj = {}
      for(let i = 0;i<arr.length;i++){
        if (!obj[arr[i]]) {
          newArr.push(arr[i])
          obj[arr[i]] = 1
        } else {
          obj[arr[i]] ++
        }
      };
      return newArr
    }
    console.log(newArrFn(arr));

 

 5、Map 方法去重

var arr = [1,2,3,4,4,4,5]
    // 数组去重:
    // 方法11 :Map
    function newArrFn (arr) {
      let newArr = []
      let map = new Map()
      for(let i = 0;i<arr.length;i++){
        // 如果 map里面不包含,就设置进去
        if (!map.has(arr[i])) {
          map.set(arr[i], true)
          newArr.push(arr[i])
        }
      };
      return newArr
    }
    console.log(newArrFn(arr));

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值