如何用javascript过滤数组_filter方法怎么工作【教程】

filter方法返回新数组且不修改原数组,常见错误是回调函数未返回布尔值、误用赋值符、未处理null/undefined导致空数组;其回调接收item、index、array三参数,需注意falsy值处理与性能优化。

filter 方法不会修改原数组,它返回一个新数组,只包含让回调函数返回真值的元素。这是它最核心的行为,也是你误用它的最大风险点——比如想“删掉”某些项却忘了赋值给新变量。

为什么 filter 返回空数组?常见原因

多数时候不是方法错了,而是回调函数没按预期返回布尔值:

  • 忘记 return(函数体是花括号但没写 return),隐式返回 undefined → 被转为 false
  • 用了赋值语句如 arr[i] = ...console.log(...) 当作判断逻辑
  • 比较时用了赋值符 = 而不是 ===,导致永远返回真值或报错
  • null / undefined

    元素直接调用方法(如 item.toLowerCase()),抛出 TypeError 中断执行

filter 回调函数的三个参数怎么用

签名是 filter((item, index, array) => { ... }),其中:

  • item:当前遍历的元素,最常用
  • index:当前下标,适合需要位置逻辑的场景(如“跳过前两个”“只取偶数位”)
  • array:原数组本身,极少用;但可用于对比(如“排除和数组首项相同的元素”)或调试

示例:剔除重复项(保留首次出现):

const unique = arr.filter((item, index) => arr.indexOf(item) === index);

性能与边界要注意什么

filter 是浅层遍历,时间复杂度 O(n),但实际开销取决于回调函数:

  • 避免在回调里做重操作:如每次调用 JSON.parse、正则 test 未预编译、或访问深层嵌套属性前不判空
  • 大数据量(>10k)时,考虑用 for 循环手动构建结果数组,减少函数调用和闭包开销
  • filter 对稀疏数组(如 [1, , 3])会跳过空槽,不触发回调 —— 这和 map 行为一致,但容易被忽略
  • 空数组调用 filter 总是返回 [],不会报错

真正难的不是写对语法,而是想清楚“过滤条件是否覆盖所有分支”,尤其是 null0false"" 这些 falsy 值要不要保留 —— 它们不会被自动跳过,得靠显式判断。