Shyno
Don't be shy,no problem!

 

基础数据类型数组

现有,一个数组,其中有若干元素,请将其中重复的元素去除

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]

 

posted on 2021-10-22 17:38  Shyno  阅读(593)  评论(0编辑  收藏  举报