基于数组API实现去重
-
创建一个空数组空间来比较
循环数组中的每一项添加到空数组中,每次添加的时候验证一下,新数组中是否包含这一项,有则不添加
let arr = [1,3,2,2,3,1,1,1,2]
let newArr = []
for(let i = 0; i< arr.length; i++){
let item = arr[i]
// 验证数组项是否存在,也可以用indexOf、lastIndexOf方法
if(newArr.includes(item)){
continue
}
newArr.push(item)
}
还可以将代码简化成下面这样
let arr = [1,3,2,2,3,1,1,1,2]
let newArr = []
arr.forEach(item => {
if(newArr.includes(item)) return
newArr.push(item)
})
- 创建一个对象空间来进行比较
循环数组中的每一项,将索引和值当作对象的属性和值存储起来,每次存储之前检查对象属性是否存在,若存在则删除这一项
let arr = [1,3,2,2,3,1,1,1,2]
let obj = {}
for(let i = 0; i< arr.length; i++){
let item = arr[i]
// 验证对象属性是否存在
if(obj[item])){
arr.splice(i,1)
i-- // 解决数组塌陷问题
}else{
obj[item] = arr[i]
}
}
但是从中间删除数组的一项是非常耗费性能的一件事,优化方法是将要删除的项与最后一项替换,删除最后一项来达成之前的效果。
for(let i = 0; i< arr.length; i++){
let item = arr[i]
if(obj[item])){
// 将当前项与最后一项替换
arr[i] = arr[arr.length - 1]
arr.pop(length-1)
i-- // 解决数组塌陷问题
}else{
obj[item] = arr[i]
}
}
双重循环去重
循环数组,将这一项与数组之后的每一项进行比较,若相同则删除
function removeDuplicates(arr) {
for (let i = 0; i < arr.length; i++) {
const item = arr[i]
for (let j = i + 1; j < arr.length; j++) {
if (item === arr[j]) {
arr.splice(j, 1)
j--
}
}
}
return arr
}
基于ES6的Set实现去重
Set与解构赋值去重
ES6中新增了数据类型set,set的一个最大的特点就是数据不重复。Set函数可以接受一个数组(或类数组对象)作为参数来初始化
arr = [...new Set(arr)]
Set与Array.from去重
Array.from方法可以将Set结构转换为数组结果
arr = Array.from(new Set(arr))