1.forEach+indexOf
const deduplication = (array) => {
// 补全代码
let newArr = []
array.forEach(item => {
if(newArr.indexOf(item) === -1) {
newArr.push(item)
}
});
return newArr
}
思路:创建一个新的数组,用于保存去重后的元素。通过forEach进行遍历,indexOf会查找数组中第一个符合的元素,如果不存在返回-1。通过判断该元素在新数组中是否存在,如果不存在就添加到新数组中,存在说明有重复,不添加。
方法2:Set去重
const deduplication =(array)=> {
return Array.from(new Set(array))
}
Set数据结构可以实现去重,Array.from实现数组的拷贝。
方法3:filter
const newArr = arr.filter((item, index) => {
return arr.indexOf(item) == index
})
filter内部会自己返回一个新数组 。
返回的数组中的值在原数组中的第一个索引,如果是重复的元素,那么返回的该元素第一次出现的索引跟元素当前的索引不一致 则不会加入新数组中。
方法4:includes
let newArr = []
for (var i = 0; i < arr.length; i++) {
if (!newArr.includes(arr[i])) newArr.push(arr[i])
}
includes() 方法:用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false
方法5:reduce
const deduplication = array => {
return array.reduce((previous,current)=>{
!previous.includes(current)&&previous.push(current)
return previous
},[])
}
reduce方法 传入两个参数:第一个参数是一个回调函数,函数有两个参数 第一个参数是它是上一次调用回调时返回的累积值或者是reduce的第二个参数,这里是空数组[]。如果该参数有值, 那么reduce 回调函数的preValue就是这个值。第二个参数是当前要计算的值,我们判断当前要计算的值是否包含在上一次的计算结果previous中,如果不存在则将当前值加入到preValue中,最后返回这个previous即是去重后的数组。
方法6:splice
const _deleteRepeat = array => {
let a = array.sort((a,b)=>a-b)
for(let i = 0 ; i < a.length ; i++) {
if(Object.is(a[i],a[i+1])) {
a.splice(i+1,1)
i--
}
}
return a
}
先将数组排序 然后循环遍历 如果当前a[i] 的值与 a[i+1]的值相等 那么就用splice方法 将a[i+1] 的值删除 splice删除元素时 传入的第一个参数是要删除的元素开始索引 第二个参数是要删除的个数 所以删除a[i+1]就是splice(i+1,1) 并且删除后 我们要将i-- 这是因为如果不i-- 就会执行for循环当中的i++ 会跳过当前元素并对下一个元素的值和后一个值进行比较 假如这个元素和i++前的元素是 重复的 便无法检测出来 所以应该先执行i-- 让当前元素先后退 然后在执行i++ 这样就可以比较当前 元素和下一个元素 不会导致有重复问题
方法7:哈希表Map去重
const arr = [1,2,2,3,3]
const map = new Map()
const newArr = []
arr.forEach( item => {
if (!map.has(item)) {
map.set(item, true)
newArr.push(item)
}
})
console.log(newArr);
方法8:利用对象的key
let arr = [1,2,2,3,3,4]
let obj = {};
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
if (obj[item] !== undefined) {
arr.splice(i, 1);
i--; // 解决删除元素后,数组塌陷问题
continue;
}
obj[item] = item
}
//arr:[1,2,3,4]