这里讲的是通过对比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: '广州'}]