JS 数组去重

这里讲的是通过对比ES6语法的Set和Map方法进行百万级数据量数组的去重处理对比

let arr = []
for (let i = 0; i < 1000000; i++) {
	arr[i] = parseInt(Math.random() * 1000 + 9000)
}
// 普通indexOf方法
function removeRepeat (arr) {
	let result = []
	for (let i = 0; i < arr.length; i++) {
		if (result.indexOf(arr[i]) === -1) {
			result.push(arr[i])
		}
	}
	return arr
}
// new Set()方法
function removeRepeatSet (arr) {
	return [...new Set(arr)]
	// 还可以运用ES6数组扩展Array.from()方法
	// return Array.from(new Set(arr)) // [1, 2, 3, 4]
}
// new Map()方法
function removeRepeatMap (arr) {
	let result = [],
		hash = new Map()
	for (let i = 0; i < arr.length; i++) {
		if (!hash.has(arr[i])) {
			hash.set(arr[i], 1)
			result.push(arr[i])
		}
	}
	return arr
}
console.time("removeRepeat "); //ready go
removeRepeat (arr); // removeRepeat: 613.2451171875ms
console.timeEnd("removeRepeat "); //end
console.time("removeRepeatSet "); //ready go
removeRepeatSet (arr); // removeRepeatSet: 23.23291015625ms
console.timeEnd("removeRepeatSet "); //end
console.time("removeRepeatMap "); //ready go
removeRepeatMap (arr); // removeRepeatMap: 24.049072265625ms
console.timeEnd("removeRepeatMap "); //end

然后上面的方法配合扩展运算符还可以对去除重复的字符

let str = 'ababbc'
function removeRepeatString (str) {
	return [...new Set(str)].join('')
}
removeRepeatString(str) // abc

结合对象数组进行一些简单过滤处理

let objList = [{
          id: 1,
          name: '北京'
        },
        {
          id: 2,
          name: '北京'
        },
        {
          id: 3,
          name: '上海'
        },
        {
          id: 4,
          name: '广州'
        },
        {
          id: 5,
          name: '北京'
        },
        {
          id: 6,
          name: '上海'
        }
      ],
      objList2 = [{
          id: 1,
          name: '北京'
        },
        {
          id: 2,
          name: '北京'
        },
        {
          id: 3,
          name: '上海'
        }
      ]
 // 处理对象数组的重复数据
function removeRepeatRed(objList) {
   let obj = {}
   return  objList.reduce((total, currentValue) => {
     if (!obj[currentValue.name]) {
       obj[currentValue.name] = true
       total.push(currentValue)
     }
     return total
   }, [])
 }
 // 用reduce方法处理重复数据
 function removeRepeatRed(objList) {
 	let obj = {}
	 return objList.reduce((total, currentValue) => {
	   if (!obj[currentValue.name]) {
	     obj[currentValue.name] = true
	     total.push(currentValue)
	   }
	   return total
	 }, [])
 }
 // 多个数组去除重复数据
 function removeRepeatMultiple(objList, objList2) {
    return objList.filter(item => {
      for (let i = 0; i < objList2.length; i++) {
        if (item.name === objList2[i].name) {
          return false
        }
      }
      return true
    })
  }
removeRepeatObj(objList) // [{id: 1, name: '北京'}, {id: 3, name: '上海'}, {id: 4, name: '广州'}]
removeRepeatRed(objList) // [{id: 1, name: '北京'}, {id: 3, name: '上海'}, {id: 4, name: '广州'}]
removeRepeatMultiple(objList, objList2) // [{id: 4, name: '广州'}]
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值