数组删除迭代

有个100长度的数组recieDetailList,我想删除里面的空项,这样写为什么不对?


          recieDetailList.forEach((item,index)=>{

              if(!item.medicine){

                  

                  console.log("kong")

                  recieDetailList.splice(index,1)

                  console.log(recieDetailList)

              }

          })

删完发现只有50条,为何没删除干净


杨__羊羊
浏览 477回答 3
3回答

慕妹3242003

首先说为什么,就是数组的实际下标和forEach回调函数中的index发生了错位举个例子,arr=[0,0,0,1,0,1],删除掉其中所有为0的项,如果代码写为:arr.forEach((item, index) => {    if(item === 0)        arr.splice(index, 1)})那么返回的结果为arr=[0, 1, 1]具体的原因是:index=0,arr=[0,0,0,1,0,1],删掉第0项,arr=[0,0,1,0,1];index=1,arr=[0,0,1,0,1],删掉第1项,arr=[0,1,0,1],从这一步就能看出来index=1的原义是删掉原数组[0,0,0,1,0,1]中的下标为1的0,但是由于原数组已经被删掉了第一个0,所以此时数组下标为1的项是原数组中下标为2的项,所以会漏掉一些本应该删掉的项。不知道我说明白了吗

翻过高山走不出你

recieDetailList=recieDetailList.filter((item,index)=>{          return !item.medicine       })

慕容708150

没对的原因是splice在删除的同时,也改变了数组自身的长度。你下一个的index会往前跳一个,所以没删完。你可以试着,倒序的遍历即:for(i=arr.length;i>0;i--) 这样
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript