昨天一个朋友让我帮她修改的一段代码:
需求要每条数据轮播1分钟,然后删除,运行的时候会发现foreach循环中,删除一个之后,其他的就无法删除了。
【分析原因】
数据格式例如:['a','b','b','c'],需求是删除item为‘b’的元素
第一次循环:SysNotices数据:['a','b','b','c'],index为0,item:'a',不符合需求,
第二次循环:SysNotices数据:['a','b','b','c'],index为1,item:'b',执行splice(index,1),
第三次循环:SysNotices数据:['a','b','c'],index为2,item:'c',不符合需求,
到此数据中还有一个'b'删除不掉
使用splice删除数组元素会改变原始数组,这样会打乱foreach的index指向数组的下标
解决方法:
for
for(var i=0,sign=true,len=that.data.SysNotices.length;i<len;sign ? i++ : i){if(that.data.SysNotices[i] && that.data.SysNotices[i].kind == 1){sign = false;setTimeout(() => {that.data.SysNotices.splice(i,1)that.setData({SysNotices: that.data.SysNotices,currentSwiper:0})}, 60000)}else{sign = true;}}
使用sign标记是否执行删除操作,删除元素则i保持不变,不执行删除时i++ ,保证下一次循环时的指向的数组元素正确。
暂时写到此处,如有其他更好的方法再更新。