一、去重
- 重复数组:[1, 2, 3, 1, 2, 4] -> [1, 2, 3, 4]
- ①、循环遍历+indexOf ②、排序后去重 ③、reduce或filter ④、Set
1. 循环遍历+indexOf
function unique(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
let current = arr[i]
if (res.indexOf(current) === -1) {
res.push(current)
}
}
return res
}
unique(arr)
2. 排序后去重
- 通过sort排序后判断当前值是否与上一个值相等,如果是,则说明重复,不重复的时候添加进res
function unique(arr) {
let res = []
let sortArr = arr.sort()
let seen
for (let i = 0; i < sortArr.length; i++) {
if (!i || seen !== sortArr[i]) {
res.push(sortArr[i])
}
seen = sortArr[i]
}
return res
}
unique(arr)
3. reduce、filter
3.1 reduce
let myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd']
let myOrderedArray = myArray.reduce(function (accumulator, currentValue) {
if (accumulator.indexOf(currentValue) === -1) {
accumulator.push(currentValue)
}
return accumulator
}, [])
3.2 fillter
function unique(arr) {
return arr.filter((item, index) => {
return arr.indexOf(item) === index
})
}
unique(arr)
4. Set
4.1 什么是Set?
- Set是ES6新增的一种数据结构,类似于数组,但是成员的值都是唯一的
4.2 实现
[...new Set(array)]
Array.from(new Set(arr))
二、获重
1. filter
function getDuplicates(arr) {
return arr.filter((item, index) => arr.indexOf(item) !== arr.lastIndexOf(item) && arr.indexOf(item) === index);
}
2. Set
function getDuplicates(arr) {
const duplicates = [];
const unique = new Set();
for (const item of arr) {
if (unique.has(item)) {
duplicates.push(item);
} else {
unique.add(item);
}
}
return duplicates;
}