如何通过查询对象内的多个键值条件过滤嵌套结构的对象数组
实现方案
你可以用以下通用过滤函数完成多条件匹配,完美适配你给出的嵌套数据结构和查询格式:
// 通用多条件过滤函数 function filterData(data, query) { return data.filter(item => { // 校验当前项是否满足所有查询条件 return query.args.every(condition => { const { key, value } = condition; // 提取对应字段的$t值,统一转小写做大小写不敏感匹配 const targetValue = item[key]?.['$t']?.toLowerCase(); return targetValue === value.toLowerCase(); }) }) } // 测试示例 // 你的原始数据 const originData = [ { 'xml:id': 'Name1', sex: { '$t': 'M' }, occupation: { n: 1, '$t': 'bank' } }, { 'xml:id': 'Name2', sex: { '$t': 'M' }, occupation: { n: 1, '$t': 'writer' } }, { 'xml:id': 'Name3', sex: { '$t': 'F' }, occupation: { n: 1, '$t': 'bank' } }, { 'xml:id': 'Name4', sex: { '$t': 'M' }, occupation: { n: 1, '$t': 'writer' }, }, { 'xml:id': 'Name5', sex: { '$t': 'M' }, occupation: { n: 1, '$t': 'writer' } } ] // 你的查询对象 const pers_query = { type: 'person', args: [ { key: 'occupation', value: 'bank', }, { key: 'sex', value: 'f', }, ], }; // 执行过滤 const result = filterData(originData, pers_query); console.log(result);
输出结果
执行后得到的结果和你预期完全一致:
[ { 'xml:id': 'Name3', sex: { '$t': 'F' }, occupation: { n: 1, '$t': 'bank' } } ]
逻辑说明
- 用
Array.filter遍历原始数组筛选符合条件的项 - 用
Array.every校验每个项是否满足所有查询条件,默认是且的逻辑,符合你的需求 - 匹配时统一将目标值和查询值转成小写,自动适配大小写不一致的场景(比如你查询的是小写
f,数据存的是大写F也能正确匹配) - 自动适配你给出的嵌套
$t字段结构,如果后续新增其他需要查询的字段只要结构一致,不用修改函数直接加查询条件即可
内容的提问来源于stack exchange,提问作者RootAtKali
相关产品推荐
相关产品推荐

