JavaScript处理JSON数组过滤与映射的核心是filter筛选、map转换,常组合使用;配合flatMap、some、find或Set可高效应对嵌套、去重、关联等场景,无需第三方库即可写出清晰高效代码。

JavaScript 中处理 JSON 数组的过滤与映射,核心在于用对原生数组方法——filter 负责筛选,map 负责转换,两者常组合使用,配合 flatMap、some、find 或 Set 可应对绝大多数嵌套、去重、关联等复杂场景。不依赖第三方库也能写出清晰、高效、可读性强的代码。
基础过滤:用 filter 精准匹配条件
filter 返回满足条件的新数组,原数组不变。适合按字段值、范围、存在性等做筛选。
- 单字段精确匹配:
data.filter(item => item.status === 'active') - 多条件组合:
data.filter(item => item.price > 100 && item.inStock) - 字符串模糊搜索:
data.filter(item => item.name.toLowerCase().includes('john')) - 检查嵌套属性是否存在(防报错):
data.filter(item => item.address?.city === 'Shanghai')
灵活映射:用 map 提取、重组或计算字段
map 对每个元素执行转换,返回结构统一的新数组。注意避免在 map 中做副作用操作(如修改原对象)。
- 提取单一字段:
data.map(item => item.id) - 构造新对象(常用):
data.map(({id, name, email}) => ({id, fullName: name, contact: email})) - 带计算逻辑:
data.map(item => ({...item, discountedPrice: item.price * 0.9})) - 处理嵌套数组字段(如 persons):
data.map(item => item.persons.map(p => p.name).join(', '))
处理嵌套与关联数据:filter + some / includes / find
当需要根据另一个数组中的 ID、标签或条件来筛选主数组时,避免双层循环,优先用 Set 或 some 提升性能。
立即学习“Java免费学习笔记(深入)”;
- 用 Set 加速 ID 匹配:推荐用于大数据量
const targetIds = new Set([100, 200, 300]);<br>data.filter(item => targetIds.has(item.id))
- 根据对象数组筛选(如查出含指定 tag 的记录):
const wantedTags = ['urgent', 'review'];<br>data.filter(item => item.tags?.some(t => wantedTags.includes(t)))
- 关联另一份数据(如从 users 中取出 profile 匹配的用户):
const profiles = [{userId: 101, role: 'admin'}, {userId: 102, role: 'user'}];<br>users.filter(u => profiles.some(p => p.userId === u.id))
高级组合:flatMap + map + Set 实现扁平化去重映射
适用于从嵌套数组中批量提取并去重(例如所有事件下的唯一科目名、所有订单中的商品 SKU)。
- 提取所有 subjects.name 并去重:
[...new Set(data.flatMap(item => item.subjects?.map(s => s.name) || []))] - 带空值防护的健壮写法:
data<br> .flatMap(item => item.subjects || [])<br> .map(subject => subject.name)<br> .filter(name => typeof name === 'string')<br> .filter((name, i, arr) => arr.indexOf(name) === i)
- 更简洁等效(ES2024+):
Array.from(new Set(data.flatMap(item => item.subjects?.map(s => s.name) ?? [])))


















