filter创建新数组并自动连续索引,不修改原数组;“空元素”需明确定义,如过滤假值用item,保留0/false则用item!==""&&item!=null;无需splice重索引,引用类型需map浅拷贝。

JavaScript 中 filter 本身不会“移除”元素,而是创建一个新数组,只包含满足条件的原数组元素;这个过程天然就重构了索引——新数组从 0 开始连续编号,无需手动处理索引。
filter 的本质是生成全新数组
filter 不修改原数组,也不关心旧索引。它逐个检查每个元素,把通过测试的元素按顺序放进新数组。结果数组的索引自动是 0, 1, 2, ...,完全连续。
- 原数组:
["a", "", "b", null, "c", undefined] - 执行:
arr.filter(item => item) - 结果:
["a", "b", "c"],索引就是0、1、2
如何准确判断“空元素”
所谓“空”,需明确定义。常见情况及推荐写法:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 过滤假值(
false、0、""、null、undefined、NaN):直接用item或Boolean(item) - 仅过滤空字符串和
null/undefined,但保留0和false:item !== "" && item != null - 严格过滤空字符串(不含空格):
typeof item === "string" && item.trim() !== "",或更安全地先判类型:item != null && typeof item === "string" && item.trim()
不需要手动重索引,也别用 splice + for
有人误以为要边遍历边 splice 来“重排索引”,这是错误思路:
立即学习“Java免费学习笔记(深入)”;
-
splice会改变原数组长度,导致后续索引错位,容易漏项或重复处理 -
filter是函数式、声明式操作,语义清晰、安全可靠、性能良好 - 若真需原地修改(极少见),可用
arr.length = 0; arr.push(...filtered),但通常没必要
小提醒:注意引用类型和深拷贝
filter 返回的是原数组中元素的引用(对对象、数组等),不是深拷贝:
- 如果过滤后修改了某个对象属性,原数组对应项也会变(因为是同一对象)
- 如需完全隔离,应配合
map做浅拷贝,例如:arr.filter(x => x).map(x => ({...x}))

















