js的splice非常强大,可以实现删除、添加、替换数字中的元素。但是它有个致命的问题,如果多次使用,会导致数组的索引混乱,达不到预期效果。如下:
1、要求删除下面数组中,type为1的元素:
var serviceList = [ { label: '客服组', type: 0, children: [ { label: '客服组1', type: 0, children: [ { label: '客服组2', type: 0 }, { label: '张三', type: 1 } ] }, { label: '里斯', type: 1 }, { label: '王武', type: 1 }, { label: '客服组2', type: 0 } ] } ] function delType1(list){ list.forEach((item, index) => { if(item.type === 1){ list.splice(index, 1) }else{ if(item.children){ delType1(item.children) } } }) } delType1(serviceList) console.log(serviceList)
结果如下:
可以看到,数组中type为1的,并没有删除干净。起因就是删除上一个type为1的元素后,数组的索引少了一个,导致下次循环,略过了当前的符合条件的这一项。解决办法也简单,倒叙递归就可以了。修改上面的函数:
function delType1(list){ for(var i=list.length-1; i>=0; i--){ if(list[i].children){ delType1(list[i].children) }else if(list[i].type === 1){ list.splice(i, 1) } } }
再次执行,结果如下: