为什么删除空字符串的JS函数无法删除连续两个空字符串?
问题根因
你遇到的问题是遍历数组时调用splice修改原数组导致索引错位,具体逻辑如下:
splice方法会直接修改原数组,当你删除下标为i的元素后,该位置之后的所有元素都会向前移动一位,数组总长度同步减1- 当遇到连续空字符串时,你删除
i位置的空串后,原本位于i+1位置的空串会移动到i的位置,但for循环会执行i++跳到下一个下标,直接跳过了这个刚移动到i位置的空串,就会出现漏删。
以你提供的测试数组为例,连续空串位于下标3和4,执行过程如下:
- 当
i=3时判断元素为空,执行splice(3,1)删除该元素,原本下标4的空串移动到下标3的位置,原末尾的Tim从下标5移动到4 - 循环执行
i++,i变为4,直接跳过了现在位于下标3的空串,所以最终结果中会残留这个空串。
解决方案
方案1:倒序遍历数组
从数组末尾向前遍历,删除元素不会影响还未遍历的前半部分索引,不会出现漏删:
function deleteBlankItems(items) { for (let i = items.length - 1; i >= 0; i--) { if (items[i].length === 0) { items.splice(i, 1); } } return items; }
方案2:删除元素后回退索引
删除元素后将i减1,让下一轮循环继续检查当前位置:
function deleteBlankItems(items) { for (let i = 0; i < items.length; i++) { if (items[i].length === 0) { items.splice(i, 1); i--; } } return items; }
方案3:使用filter方法(推荐)
直接通过数组内置的filter方法生成新数组,无需修改原数组,也没有索引问题,代码更简洁:
function deleteBlankItems(items) { return items.filter(item => item.length !== 0); }
内容的提问来源于stack exchange,提问作者Leah Davis
相关产品推荐
相关产品推荐

