一、有序数组的去重
- 暴力去重,利用循环每次判断当前元素是否在数组中别的地方出现过,此处不展开介绍
- 利用 es6 的 Set 是不重复集合的特性
function reduceRepeatBySet(arr) {
return Array.from(new Set(arr))
}
- 利用object的key不能重复的特性
function reduceRepeatByObject(arr) {
let obj = {}
let newArr = []
arr.forEach(value => {
if (!obj[value]) {
newArr.push(value)
obj[value] = true
}
})
return newArr
}
- 使用栈,每次入栈前和栈顶进行比较
function reduceRepeatByStack(arr) {
let [first, ...rest] = arr
let stack = first ? [first] : []
if (rest && rest.length) {
rest.forEach(value => {
if (stack.top() != value) {
stack.push(value)
}
})
}
return stack
}
- 使用 array.reduce 方法,和栈类似
function reduceRepeatByReduce(arr) {
let newArr = arr.reduce((currentArr, next) => {
if (Array.isArray(currentArr)) {
if (currentArr.top() != next) {
currentArr.push(next)
}
} else {
currentArr = [currentArr, next]
}
return currentArr
})
return newArr
}
- 使用array.filter方法,每次只返回可能重复的第一个数
function reduceRepeatByFilter(arr) {
let newArr = arr.filter((value, index, array) => {
return index <= array.indexOf(value);
})
return newArr
}
二、无序数组去重
- 给数组排个序,然后用有序数组去重的方法
- 暴力去重,利用循环每次判断当前元素是否在数组中别的地方出现过,此处不展开介绍
- 利用 es6 的 Set 是不重复集合的特性(代码和上面的一样)
- 利用object的key不能重复的特性(代码和上面的一样)
- 使用array.filter方法,每次只返回可能重复的第一个数(代码和上面的一样)
- 暴力去重另一种方式,将重复标记为undefined
function reduceRepeatByForce(arr) {
let newArr = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] != undefined) {
let j = arr.lastIndexOf(arr[i])
if (i != j) {
for (; j < i; j--) {
if (arr[j] == arr[i]) {
arr[j] = undefined
}
}
} else {
newArr.push(arr[i])
}
}
}
return newArr
}