基础数据类型数组
现有,一个数组,其中有若干元素,请将其中重复的元素去除
let arr = [1,1,2,3,4,4,5,6,6]
方法1:唯一添加法
声明一个新数组,然后将原来的数组一个个加入到新数组(新数组没有相同值得情况),关键是需要一个isClude去判断是否newArr是否已经包含了此元素
let arr = [1,1,2,3,4,4,5,6,6] let newArr=[] arr.forEach((item)=>{ let isClude =false newArr.forEach((item1)=>{ if(item===item1){ isClude=true } }) if(!isClude){ newArr.push(item) } }) console.log('newArr',newArr)//[1,2,3,4,5,6]
方法2:对象属性重复属性会覆盖
这种方法比较取巧,就是声明一个对象,然后将该数组的元素作为对象的属性名,属性值随便设,然后利用对象属性名不会重复的特点可得到一个对象。接下来再利用Object.keys()拿到属性名
let arr = [1,1,2,3,4,4,5,6,6] let newObj={} arr.forEach((item)=>{ newObj[item]=0 }) console.log('newArr',Object.keys(newObj))//此时拿到的元素均为字符串 ['1','2','3','4','5','6'] let newArr = Object.keys(newObj).map((item)=>+item) //将元素处理成number console.log('newArr',newArr) //[1,2,3,4,5,6]
复杂数据类型不能作为对象的属性名,所以数组中有数组和对象时就不能用这种方案.数组赋值给对象属性名的时候会先arr.join(',')然后再作为属性名,[4,5]变成'4,5',而对象则会变成'[object Object]',先不考虑相不相等,反正最后复原成原数组就很难.
let arr = [1,1,2,3,[4],5,6,6] let newObj={} arr.forEach((item)=>{ newObj[item]=0 }) console.log('newArr',Object.keys(newObj))//此时拿到的元素均为字符串 ['1','2','3','4','5','6'] let newArr = Object.keys(newObj).map((item)=>+item) //将元素处理成number console.log('newArr',newArr) //[1,2,3,4,5,6]
方法3:set数据结构的元素唯一性
set数据结构的特点就是元素是不可重复的,重复的元素会被自动去除,但是set数据并不是数组,所以需要借用Array.from()或者拓展运算符去将其转化成数组
let arr = [1,1,2,3,4,4,5,6,6] let newObj=new Set(arr) console.log('newArr',newObj)//此时拿到的是一个Set数据 let newArr = Array.from(newObj) //将数据处理成 console.log('newArr',newArr) //[1,2,3,4,5,6]
复杂数据类型数组
现有,一个数组,其中有若干元素,请将其中重复的元素去除
let arr = [1,1,2,3,[4],[4],5,6,6]
以上的这几种方法并不能去除重复的数组元素,比如
let arr = [1,1,2,3,[4],[4],5,6,6] let newArr=[] arr.forEach((item)=>{ let isClude =false newArr.forEach((item1)=>{ if(item===item1){ isClude=true } }) if(!isClude){ newArr.push(item) } }) JSON.stringify([4]) console.log('newArr',newArr)//[1,2,3,[4],[4],5,6]
原因:复杂数据类型在栈中是以地址的形式存在的,也就是说arr[4]和arr[5]虽然都是[4]这个数组,但我们在比较arr[4]和arr[5]的时候,它们是代表两个数组的地址,地址值是不一样的,所以arr[4]!==arr[5].Set()数据结构保持唯一性也用的类似方案,所以也不行.
最终解决方案:元素转成JSON数据再对比,需要用到JSON.stringify()函数
代码如下
let arr = [1,1,2,3,[4],[4],5,6,6]
let newArr=[]
arr.forEach((item)=>{
let isClude =false
newArr.forEach((item1)=>{
if(JSON.stringify(item)===JSON.stringify(item1)){
isClude=true
}
})
if(!isClude){
newArr.push(item)
}
})
console.log('newArr',newArr)//[1,2,3,[4],5,6]