一、结构简单的数组去重
1.1 嵌套for循环去重
function unique(arr){
for(let i = 0;i<arr.length;i++){
//由于嵌套的for循环也是遍历相同数组,则相同位置肯定一样,所以跳过相同位置的元素校验,故取j=i+1 (即拿当前元素跟它后面的所有元素比较)
for(let j = i+1;j<arr.length;j++){
if(arr[i] === arr[j]){
arr.splice(j,1);
j--; //上面去掉数组的一个元素,索引发生变化,j--为了确保继续校验下一个元素
}
}
}
//返回过滤后数组
return arr
}
let arr1 = [1,2,2,3,5,5]
let uniqueArr = unique(arr1)
1.2 利用set数据结构去重
//set数据结构的数据具有唯一性 Array.from将其转化为真正的数组
function unique(arr){
return Array.from(new Set(arr))
}
let arr1 = [1,2,2,3,5,5]
let uniqueArr = unique(arr1)
1.3 利用includes()方法去重
let arr1 = [1,2,2,3,5,5]
function unique(arr) {
let result = []
for(let i = 0;i<arr.length;i++){
//将result不包含的遍历项push进去
result.includes(arr[i]) ? "" : result.push(arr[i])
};
return result
}
let uniqueArr = unique(arr1)
二、结构复杂的数组去重
2.1 对象访问属性的方法 判断对象中是否存在key
function unique(arr){
let result = []
let obj = {} //用于存储未重复前的key为true
for(let i = 0;i<arr.length;i++){
if(!obj[arr[i].key]){
result.push(arr[i])
obj[arr[i].key] = true //下一次循环数组里有相同的key时则便无法进入if代码块,故而实现去重
}
}
return result
}
let arr1 = [
{key:"1",value:"张三"},
{key:"2",value:"赵六"},
{key:"1",value:"张三"}
]
let uniqueArr = unique(arr1)
2.2 reduce()遍历数组,reduce()第一个参数是遍历项要执行的函数,第二个参数为preV的初始值;
去重思想还是访问对象属性,判断key值是否存在,只是由for循环变成了reduce()方法。
(注:reduce()方法若没有第二个参数则初始值为数组第一个元素)
let arr1 = [
{key:"1",value:"张三"},
{key:"2",value:"赵六"},
{key:"1",value:"张三"}
]
let obj = {}
//preV的初始值为[]
let uniqueArr = arr1.reduce((preVal,item)=>{
obj[item.key] ? "": obj[item.key] = true && preVal.push(item);
return preVal
},[])