数组的去重
一. 普通双循环去重
// 操作原数组
let array = [3, 1, 1, 1, '1', 7, 1, 3, 2, 5, 4, 3, 2, 5, 7, 8, 9, 8];
for(let i = 0, len = array.length; i<len; i++){
for(let j = i+1, len = array.length; j<len; j++){
if(array[i] === array[j]){
array.splice(j,1);
// 这一步非常重要,j向前走了一步,去重删除后,需要后退一步,保证去重不漏
j--
}
}
}
console.log(array) // [3, 1, "1", 7, 2, 5, 4, 8, 9]
// 定义一个新的数组,来接收去重后的数组
let newArr = [];
for(let i = 0, len = array.length; i<len; i++){
// 这里的判断条件写法还有很多
// newArr[i] !== array[i]
// newArr.indexOf(array[i]) === -1
if(!newArr.includes(array[i])){
newArr.push(array[i])
}
}
console.log(newArr) // [3, 1, "1", 7, 2, 5, 4, 8, 9]
二.利用forEach
,map
,reduce
去重
// forEach返回值是undefined
let newArr = [];
array.forEach(each => {
if(!newArr.includes(each)){
newArr.push(each)
}
});
console.log(newArr) // [3, 1, "1", 7, 2, 5, 4, 8, 9]
// map有返回值
let newArr = [];
array.forEach(each => {
if(!newArr.includes(each)){
newArr.push(each)
}
});
console.log(newArr) // [3, 1, "1", 7, 2, 5, 4, 8, 9]
// reduce,第二个参数是pre的初始值
array.reduce((pre,cur) => {
if(!pre.includes(cur)){
pre.push(cur)
}
// 可以自己打印看一哈pre的cur是啥子
console.log(pre,cur)
return pre
},[]);
console.log(pre) // [3, 1, "1", 7, 2, 5, 4, 8, 9]
三.利用Set
和Aarry.from
/…扩展运算符去重(一句话)
// Set和Map类似,都是一组key的集合,但是Set不存储value。由于key不能重复,所以,可用于去重
let newArr = Array.from(new Set(array))
let newArr = [...new Set(array)];
console.log(newArr) // [3, 1, "1", 7, 2, 5, 4, 8, 9]
四.自己封装去重方法
/**
* @param
* arr 要去重的数组
* option 如果是对象类型的数组,那么option就是你指定的去重的关键字
* @return
* newArr,去重后的数组
*/
// ES6函数入参可传入默认值,不传值则直接取用默认值[]
function removeDuplicate (arr = [],option) {
// 存储去重后的数据
let newArr = [];
// 用于存储唯一标志所对应的value
let newArrKey = [];
// Object.prototype.toString.call()是判断类型的方法,比typeof,instanceof判断靠谱
if(Object.prototype.toString.call(arr) !== '[object Array]' ){
alert('你需要传入一个数组参数')
return
} else {
if (option){
arr.map(each => {
console.log(each)
if(!newArrKey.includes(each[option])){
newArrKey.push(each[option])
newArr.push(each)
}
});
} else newArr = Array.from(new Set(arr))
}
return newArr
}