AngularJS中通过对象过滤对象数组的技术实现问询
过滤对象数组:匹配过滤对象的任意属性条目
没问题,这个需求用JavaScript的原生数组方法就能轻松实现。核心思路是利用Array.filter()筛选数组,再结合Object.entries()和Array.some()来检查每个对象是否满足「匹配过滤对象的任意一个键值对」的条件。
先整理合法的待过滤数组
你给出的accounts数组格式有点小问题,我先修正成标准的JavaScript数组:
const accounts = [ { id: 24, name: 'name24', company: 'company1', location: 'location1' }, { id: 25, name: 'name25', company: 'company2', location: 'location1' }, { id: 26, name: 'name26', company: 'company1', location: 'location2' }, { id: 27, name: 'name27', company: 'company3', location: 'location1' }, { id: 28, name: 'name28' } ];
实现过滤函数
下面是完整的过滤逻辑,我会逐行解释:
function filterAccounts(accounts, filterObj) { // 把过滤对象转换成[key, value]格式的键值对数组 const filterEntries = Object.entries(filterObj); // 如果过滤对象为空,直接返回原数组(可选的边界处理) if (filterEntries.length === 0) return [...accounts]; // 过滤数组:保留满足任意一个过滤条件的对象 return accounts.filter(account => { // 检查当前对象是否匹配过滤对象中的任意一个键值对 return filterEntries.some(([key, value]) => { // 先确保对象有这个属性,再比较值是否相等 return account.hasOwnProperty(key) && account[key] === value; }); }); }
示例调用与结果
比如我们定义一个过滤对象,要找company为company1或者location为location2的账户:
const filterObj = { company: 'company1', location: 'location2' }; const filteredAccounts = filterAccounts(accounts, filterObj); console.log(filteredAccounts); // 输出结果: // [ // { id: 24, name: 'name24', company: 'company1', location: 'location1' }, // { id: 26, name: 'name26', company: 'company1', location: 'location2' } // ]
关键逻辑说明
Object.entries(filterObj):把过滤对象拆解成键值对数组,比如上面的filterObj会变成[['company', 'company1'], ['location', 'location2']],方便我们遍历每个过滤条件。Array.some():只要有一个过滤条件匹配,就返回true,完美贴合「任意一项匹配就保留」的需求。account.hasOwnProperty(key):避免读取对象不存在的属性导致的潜在问题(比如如果某个账户没有company属性,不会报错)。
如果你的过滤需求有特殊规则(比如模糊匹配、忽略大小写),只需要修改some()里的比较逻辑就行,比如把account[key] === value改成account[key]?.toLowerCase().includes(value.toLowerCase())就能实现大小写不敏感的模糊搜索。
内容的提问来源于stack exchange,提问作者john doe
相关产品推荐
相关产品推荐

