You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么删除空字符串的JS函数无法删除连续两个空字符串?

问题根因

你遇到的问题是遍历数组时调用splice修改原数组导致索引错位,具体逻辑如下:

  • splice方法会直接修改原数组,当你删除下标为i的元素后,该位置之后的所有元素都会向前移动一位,数组总长度同步减1
  • 当遇到连续空字符串时,你删除i位置的空串后,原本位于i+1位置的空串会移动到i的位置,但for循环会执行i++跳到下一个下标,直接跳过了这个刚移动到i位置的空串,就会出现漏删。

以你提供的测试数组为例,连续空串位于下标3和4,执行过程如下:

  1. 当i=3时判断元素为空,执行splice(3,1)删除该元素,原本下标4的空串移动到下标3的位置,原末尾的Tim从下标5移动到4
  2. 循环执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:57:02