数组塌陷问题以及数组去重

文章介绍了数组塌陷的现象,即在循环删除数组元素时,由于数组长度的变化导致循环提前结束。提供了三种删除数组所有内容的方法,包括从尾部删除的pop方法,从头部删除的shift方法,以及使用splice删除片段。接着,文章讨论了数组去重的三种策略,包括使用indexOf删除重复值,创建新数组存储唯一值,以及利用filter方法过滤掉重复元素。

一、数组塌陷

首先先用一个小案例对数组塌陷进行解释:

//需求:删除数组[0, 1, 2, 3, 4, 5]里的所有内容
//方法1:使用pop删除末尾的数字,并循环这个过程
var arr = [0, 1, 2, 3, 4, 5]
for(var i = 0; i < arr.length; i++){
    arr.pop(function(){
    return arr
  })
}
console.log(arr)  //此时打印的值为:[0,1,2]  
//为什么没有完全删除:随着数据的删减,数组的长度也在不断变化,当i=3时,数组的长度也为3,循环不再继续。

这个现象就叫做“数组塌陷”。

//修改上述做法:
var arr = [0, 1, 2, 3, 4, 5]
for(var i = arr.length - 1; i < 0; i--){
    arr.pop(function(){
    return arr
  })
}
console.log(arr)
//方法2:使用shift删除数组的第一个数字,并循环这个过程
var arr = [0, 1, 2, 3, 4, 5]
for(var i = arr.length - 1; i < 0; i--){
    arr.shift(function(){
    return arr
  })
}
console.log(arr)
//方法3:使用splice删除片段
for(var i = 0; i < arr.length; i++){
arr.splice(function(){
    return(i,1)
    i--
  })
}
console.log(arr)

二、数组去重

//需求:将数组var arr = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]去重
//方法1:找到重复值,然后删除
var arr = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]
for(var i = 0; i < arr.length; i++){
   if(arr.indexOf(arr[i],arr[i + 1]) !== -1){     //如果返回值不为-1,说明在数组内找到了重复的值
     arr.splice(i, 1)          //将找到的重复的值删除 
 i--                          //解决数组塌陷问题
   }
}
console.log(arr)
//方法2:建立一个新数组,与原数组进行比较,将没有的值添加进去
var arr = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]
var res = new Array()
for(var i = 0; i < arr.length; i++){
   if(res.indexOf(arr[i]) === -1){     //如果满足此条件,说明数组之间没有重复的值
      res.push(arr[i]))                
   }
}
console.log(res)
//方法3:用过滤filter做
var arr = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]
var res = arr.filter(function(item,index){
   return arr.indexOf[item] === index 
}
console.log(res)
//分析:用indexOf查找到每一项数据所对应的索引,利用indexOf查找的是第一次出现的数据的索引的特点,如果查找到的索引与数据本身的索引相等,就说明此数据是第一次出现,与之前数据没有重复;如果查找到的数据与数据本身数据不相等,那么就说明在此数据之前有与之重复的数据;最后我们return出去的就是第一次出现的元素,不满足条件的元素就被过滤了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值