
本文介绍如何对多层嵌套结构(如对象数组中每个对象包含一个 items 数组)进行精准筛选:仅过滤内层数组中的元素,同时保留外层结构不变。核心方法是组合使用 map() 与 filter()。
本文介绍如何对多层嵌套结构(如对象数组中每个对象包含一个 items 数组)进行精准筛选:仅过滤内层数组中的元素,同时保留外层结构不变。核心方法是组合使用 map() 与 filter()。
在实际开发中,常遇到类似「分类列表 + 分类下商品/动物/项目」的数据结构。例如,categories 是一个分类数组,每个分类对象包含 categoryName 和 items(子项数组),而我们需要只筛选每个分类内部的 items(如 power > 50 的动物),但不删除任何分类本身——即保持外层数组长度和结构不变,仅净化内层数组。
此时,错误做法是直接对 categories 使用 filter()(如 categories.filter(cat => cat.items.power > 50)),因为 cat.items 是数组,没有 power 属性,会返回 undefined,导致全量过滤失败;而 some() 虽能判断“是否存在符合条件项”,但它仅控制外层对象是否保留,无法实现“保留分类、精简其 items”的目标。
✅ 正确解法是:用 map() 遍历每个分类,对每个分类对象执行浅拷贝(...cat),并重写其 items 字段为筛选后的新数组:
const output = categories.map(category => ({
...category,
items: category.items.filter(item => parseInt(item.power) > 50)
}));⚠️ 注意事项:
- item.power 是字符串(如 '52'),需转为数值再比较,推荐使用 parseInt(item.power) 或一元加号 +item.power;
- 若需兼容空值或非法字符串,可增强判断:!isNaN(item.power) && +item.power > 50;
- 此操作是不可变更新(immutable):原 categories 数组未被修改,返回全新对象数组,符合现代前端最佳实践;
- 若需深度克隆(如 items 内含复杂嵌套对象且需独立引用),应配合结构化克隆或 structuredClone()(环境支持时)。
最终输出严格匹配需求:Mammals 分类保留 Dog 和 Bear(power > 50),剔除 Mouse;Reptiles 仅保留 Alligator,Turtle 被过滤。外层分类结构完整无损,语义清晰,代码简洁高效。

















