如何使用对象过滤对象数组?及如何利用外部对象字段过滤嵌套对象?
用对象过滤对象数组的两种场景解决方案
1. 基础场景:用平面对象过滤对象数组
如果你想筛选出和过滤对象所有键值对完全匹配的数组元素,核心思路就是遍历数组时,逐一检查每个元素是否满足过滤对象的每一项条件。
举个实际例子你就懂了:
// 待过滤的用户数组 const users = [ { id: 1, name: 'Alice', status: 'active', role: 'user' }, { id: 2, name: 'Bob', status: 'active', role: 'admin' }, { id: 3, name: 'Charlie', status: 'inactive', role: 'admin' } ]; // 过滤条件:找状态为active且角色是admin的用户 const filterObj = { status: 'active', role: 'admin' }; // 执行过滤 const filteredUsers = users.filter(user => { // 遍历过滤对象的所有键,确保每个键的属性值都和当前元素匹配 return Object.keys(filterObj).every(key => user[key] === filterObj[key]); }); console.log(filteredUsers); // 输出: [{ id: 2, name: 'Bob', status: 'active', role: 'admin' }]
这里用Object.keys()拿到过滤对象的所有键,再用every()保证所有条件都满足,不管过滤对象有多少个键,这个逻辑都能通用。
2. 进阶场景:嵌套对象 + 用另一个对象的字段过滤
你提到要借助另一个对象的borough字段过滤嵌套对象数组,我先模拟一个常见的嵌套结构(如果和你的实际数据有出入,调整属性路径就行):
假设你的数据是这样的:
// 带嵌套结构的餐厅数组 const restaurants = [ { id: 1, name: 'Pizza Place', location: { borough: 'Manhattan', street: '5th Ave' } }, { id: 2, name: 'Burger Joint', location: { borough: 'Brooklyn', street: 'Main St' } }, { id: 3, name: 'Sushi Bar', location: { borough: 'Manhattan', street: 'West End Ave' } } ]; // 用来过滤的参考对象(比如用户选中的目标区域) const filterCriteria = { targetBorough: 'Manhattan' };
要筛选出location.borough等于filterCriteria.targetBorough的餐厅,直接在filter回调里访问嵌套属性就行:
const filteredRestaurants = restaurants.filter(restaurant => { // 直接匹配嵌套的borough字段和过滤对象的目标值 return restaurant.location.borough === filterCriteria.targetBorough; }); console.log(filteredRestaurants); // 输出: [{ id:1, ... }, { id:3, ... }]
如果需要更灵活的过滤逻辑,还可以调整判断条件:
- 模糊匹配(包含关键词):
return restaurant.location.borough.includes(filterCriteria.targetBorough) - 多值匹配(比如匹配多个区域):
return ['Manhattan', 'Queens'].includes(restaurant.location.borough)
避坑提示
如果嵌套属性可能不存在(比如有的餐厅没有location字段),记得加判断避免报错:
const filteredRestaurants = restaurants.filter(restaurant => { // 用可选链操作符先检查location是否存在,再匹配borough return restaurant.location?.borough === filterCriteria.targetBorough; });
可选链?.会在restaurant.location为undefined时直接返回undefined,不会抛出错误。
内容的提问来源于stack exchange,提问作者Bogdan Alexandru Gavril
相关产品推荐
相关产品推荐

