
本文介绍如何对包含嵌套数组的对象数组进行条件过滤——当某对象的嵌套数组(如 totalCities)中存在指定属性值(如 city: "NY")时,保留该对象的其他字段(如 name、age),并剔除嵌套结构本身。
本文介绍如何对包含嵌套数组的对象数组进行条件过滤——当某对象的嵌套数组(如 `totalcities`)中存在指定属性值(如 `city: "ny"`)时,保留该对象的其他字段(如 `name`、`age`),并剔除嵌套结构本身。
在实际开发中,我们常遇到数据结构层级较深的场景:主对象不直接包含筛选字段,而是将其封装在嵌套数组(如 totalCities: [{ city: "NY" }, { city: "CA" }])中。此时,标准的 .filter(x => x.city === value) 将失效,需结合数组方法 some() 判断嵌套项是否存在匹配项,并配合解构赋值与 map() 提取目标字段。
核心思路分两步:
-
筛选:使用
filter()+some()检查每个对象的totalCities数组中是否至少有一个元素满足city === filterCityBy; -
投影:使用
map()配合对象解构({ totalCities, ...rest })剔除totalCities字段,只保留其余属性。
以下是完整可运行示例:
const filterCityBy = "NY";
const data = [
{ name: "Harry", age: 45, totalCities: [{ city: "NY" }] },
{ name: "Mike", age: 36, totalCities: [{ city: "NY" }, { city: "CA" }] },
{ name: "Sarah", age: 29, totalCities: [{ city: "TX" }] }
];
const filteredData = data
.filter(({ totalCities }) =>
totalCities.some(({ city }) => city === filterCityBy)
)
.map(({ totalCities, ...rest }) => rest);
console.log(filteredData);
// 输出: [ { name: "Harry", age: 45 }, { name: "Mike", age: 36 } ]
✅ 关键要点说明:
-
some()是高效判断“是否存在满足条件元素”的首选,时间复杂度为 O(n),且支持短路(找到即停); - 解构赋值
{ totalCities, ...rest }简洁地分离出待排除字段与剩余字段,避免手动罗列属性; - 若需兼容更深层嵌套(如
addresses[0].cities[1].code),可改用递归查找或lodash.get()辅助;但本例中明确路径,原生方法已足够; - 注意确保
totalCities始终为数组类型,生产环境建议增加防御性检查(如Array.isArray(totalCities))。
该方案简洁、可读性强,符合函数式编程习惯,适用于大多数前端数据预处理场景。










