第一种两次循环遍历
let arr = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 7, 7, 7, 8, 9, 9, 9, 9, 9, 9, ]
arr.forEach((item, i) => {
arr.forEach(e => {
if (item === e) {
arr.splice(i, 1)
}
})
}) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
第二种 使用 filter过滤器和indexOf方法
let arr = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 7, 7, 7, 8, 9, 9, 9, 9, 9, 9, ]
let newArr = arr.filter((item, index) => {
// indexof会返回 该项第一次出现的索引值,利用filter过滤器方法,满足第一次出现的索引值和当前索引值全等条件就会返回该项
return arr.indexOf(item) === index
}) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
第三种 利用新数组和indexOf进行去重
let arr = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 7, 7, 7, 8, 9, 9, 9, 9, 9, 9, ]
let newArr = []
arr.forEach((item, i) => {
// 如果新数组用indexOf查找没有arr数组这项,那么就将这一项用push方法添加到新数组中
if (newArr.indexOf(arr[i]) === -1) {
newArr.push(arr[i])
}
}) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
第四种 使用ES6 新方法 set 构造函数来进行去重(ES6提供了新的数据结构Set, 它类似数组,但是成员的值都是唯一的,没有重复的值,Set本身是一个构造函数,用来生成Set数据结构。)
let arr = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 7, 7, 7, 8, 9, 9, 9, 9, 9, 9, ]
let newArr = [...new Set(arr)] //[1, 2, 3, 4, 5, 6, 7, 8, 9]
第五种 就是最经典的双for循环遍历去重
let arr = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 7, 7, 7, 8, 9, 9, 9, 9, 9, 9, ]
for (let i = 0; i < arr.length; i++) {
// j= i+1 从 i 的第二项开始比较 如果相等就是重复项
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
// 重复就会从原数组中删除此项
arr.splice(i, 1)
// 并且将索引减一
i--
}
}
} // [1, 2, 3, 4, 5, 6, 7, 8, 9]