vue中forEach与splice连用删除元素出现的bug

需求:先将对象属性num的值不为0的添加一个新属性pub,然后将没有pub属性的对象删除。

正常代码实现如下:

//data中的数据源:
     msg:[{num:0},{num:4},{num:0,pub:'a'},{num:0},{num:0},{num:6}]
//正常的实现的方法:
    //1.不为0的值添加新属性
    for(let item of this.msg){
      if(item.num!=0){
        item.pub='new';
      }
    };
    //2.过滤出num不为0的对象,进行赋值
    let filterMsg=this.msg.filter(item=>item.pub)
    this.msg=filterMsg

//简化的写法(虽然不规范但也能实现效果)
     this.msg=this.msg.filter((item,index,arr)=>{
      if(item.num!=0){
        arr[index]['pub']='new'
      }
      return item.pub
     });

因为想看看还有没有其他方法可以实现,因此采用了forEach+splice方法

代码如下:

     //  不为0的值添加新属性
      for(let item of this.msg){
        if(item.num!=0){
          item.pub='new';
        }
      };
      this.msg.forEach((item,index) => {
          if(!item.pub){
            this.msg.splice(index,1)
          }  
      });

按正常的逻辑来说,上面代码是可行的,但为何效果是下面这样的。

我们来看下面这张图的解释。

splice导致遍历的元素发生了变化,但是前面两次都没有什么问题。第三次的时候遍历的索引为2,删除该元素之后,后面还有一个num值为0的元素,这个元素的索引变为了2,但由于索引为2的元素已经遍历过了,因此遍历索引为3的元素,最后存在pub属性,因此产生了这个bug。

总结:在vue里面虽然splice是响应式的,但是不建议与forEach连用,一般来讲forEach无法中断遍历,当需要过滤数据的时候还是采用filter比较好,需要修饰数组(不删减数组)的时候采用map遍历比较好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国产猛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值