javascript如何过滤数组_如何使用filter方法筛选数据【教程】
技术百科
紅蓮之龍
发布时间:2026-01-27
浏览: 次 filter不修改原数组而返回新数组,需确保回调函数每条路径显式返回布尔值,避免隐式转换、副作用及外部变量变动影响结果。
filter 方法不会修改原数组,它返回一个新数组,只包含满足回调函数返回 true 的元素。这是最安全、最常用的数组筛选方式,但容易因回调函数逻辑错误或隐式类型转换导致漏筛或误筛。
filter 回调函数必须显式返回布尔值
常见错误是忘记 return,或在条件分支中只在部分路径返回值:
const arr = [1, 2, 3, 4];
// ❌ 错误:没有 return,所有项都变成 undefined → 被转为 false → 返回空数组
arr.filter(x => { if (x > 2) return true; });
// ✅ 正确:确保每条路径都有明确的布尔返回
arr.filter(x => x > 2);
// 或
arr.filter(x => { return x > 2; });
- 箭头函数单表达式可省略
return和花括号,但一旦加了花括号,return就不可省略 - 避免依赖隐式转换,比如
arr.filter(x => x.name)会过滤掉name为""、null、undefined的项,这未必是本意
filter 配合对象数组时注意引用与深比较
筛选对象数组时,filter 本身不处理嵌套结构或复杂匹配逻辑:
const users = [ { id: 1, role: 'admin', tags: ['vip', 'beta'] }, { id: 2, role: 'user', tags: ['beta'] } ]; // ✅ 简单字段匹配 users.filter(u => u.role === 'admin'); // ✅ 数组内含匹配(如 tags 包含 'beta') users.filter(u => u.tags.includes('beta')); // ⚠️ 注意:u.tags.indexOf('beta') >= 0 和 includes 效果相同,但后者更语义化、且支持 NaN
- 不要在
filter回调里做深克隆或副作用操作(如修改原对象),它只应是纯函数 - 需要按多个条件组合筛选时,直接用逻辑运算符连接,比如
u.role === 'user' && u.tags.includes('beta')
空数组、null/undefined 元素和性能边界
filter 会跳过数组中的“空位”(sparse array 的 holes),但不会跳过 undefined 或 null 值元素:
const sparse = [1, , 3]; // 索引 1 是空位 sparse.filter(x => true); // → [1, 3],空位被忽略 const normal = [1, undefined, 3]; normal.filter(x => true); // → [1, undefined, 3],undefined 被保留
- 对超大数组(如 >10 万项)频繁调用
filter可能引发内存压力,因为每次都会创建新数组;若只需判断存在性,优先用some() - 如果后续还要对结果遍历,考虑用
for循环 +push手动收集,避免两次遍历(filter+map)
真正容易被忽略的是:当回调函数依赖外部变量时,若该变量在 filter 执行期间被修改,结果不可预测;务必确保回调是闭包安全的,或者把依赖值提前固化为常量。
# 的是
# 这是
# 都有
# 多个
# 跳过
# 每条
# 循环
# 对象
# javascript
# java
# 隐式转换
# 回调
# NULL
# map
# 隐式
# 隐式类型转换
# 类型转换
# 闭包
# 运算符
# 遍历
# for
# 回调函数
# 常量
# undefined
# Filter
# Array
# 布尔值
# 逻辑运算符
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Mac如何备份到iCloud_Mac桌面与文稿文件
- 如何高效获取循环末次生成的 NumPy 数组最后一
- Mac怎么安装软件_Mac安装dmg与pkg文件的
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- XSLT怎么生成动态的HTML属性名和标签名
- C++如何解析JSON数据?(nlohmann/j
- 如何在Golang中使用container/hea
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- Win11怎么开启上帝模式_创建Windows 1
- Win11怎么修改DNS服务器 Win11设置DN
- Win11怎么更改默认打开方式_Win11关联文件
- 如何使用Golang实现RPC序列化与反序列化_G
- Windows10蓝屏SYSTEM_SERVICE
- Mac系统更新下载慢或失败怎么办_解决macOS升
- Win11怎样安装微信开发者工具_Win11安装开
- php会话怎么开启_session_start函数
- Win11怎么设置环境变量_Win11配置Path
- 如何在Golang中编写端到端测试_Golang
- Win11怎么制作U盘启动盘_Win11原版系统安
- Win11怎么打开旧版计算器_Win11恢复传统计
- 如何使用Golang配置安全开发环境_防止敏感信息
- Win11怎么开启远程桌面连接_Windows11
- Django 测试数据库表缺失与字段未创建问题的完
- Win11怎么查看显卡温度 Win11任务管理器查
- 如何使用Golang指针与结构体结合_修改结构体内
- Win11时间格式怎么改成12小时制 Win11时
- 如何在Golang中引入测试模块_Golang测试
- Linux如何使用grep搜索文件内容_Linux
- windows系统如何安装cab更新补丁_wind
- c++中如何求一个数的平方根_c++ sqrt函数
- c++中explicit(bool)的用法 c++
- c# Task.ConfigureAwait(tr
- Windows怎样关闭桌面弹窗广告_Windows
- Win11怎么开启空间音效_Windows11耳机
- Win11怎么连接投影仪_Win11多显示器投屏设
- 如何使用Golang管理跨项目依赖_Golang多
- php命令行怎么运行_通过CLI模式执行PHP脚本
- c# 如何用c#实现一个支持优先级的任务队列
- Win11怎么开启游戏模式_Win11优化游戏帧数
- Windows10如何更改开机密码_Win10登录
- C#如何在一个XML文件中查找并替换文本内容
- Win11怎么设置桌面图标间距_Windows11
- Win11怎么忘记WiFi网络_Win11删除已保
- 如何使用正则表达式批量替换重复的 *- 模式为固定
- 如何在Golang中使用log包输出不同级别日志_
- Python函数接口稳定性_版本演进解析【指导】
- Win11如何卸载OneDrive_Win11卸载
- Go 中 defer 语句在 goroutine
- php订单日志权限怎么设_php订单日志文件权限设
- php串口通信波特率怎么选_根据硬件手册设置正确波


QQ客服