如何用JavaScript实现对象类型数据集按查询参数的且逻辑筛选
问题原因
你现有代码的逻辑是:逐个匹配单个查询条件,把所有满足单个条件的记录塞到结果集后去重,只要满足任意一个条件就会被保留,自然是OR逻辑,不符合要求。
修改方案
正确的逻辑是遍历每一条数据,判断它是否满足所有查询字段的要求:同一字段的多个可选值为OR关系,不同字段之间为AND关系,全部满足才保留。
修改后代码如下:
import _ from 'lodash'; export const Filtered = (qStrings, dataSet) => { // 无查询条件时直接返回全量数据 if (_.isEmpty(qStrings)) return Object.values(dataSet); return _.filter(Object.values(dataSet), (sess) => { // 遍历所有查询条件,只有全部满足才返回true return Object.entries(qStrings) // 过滤掉非数组的无效查询字段(适配你示例中qStrings带length属性的异常情况) .filter(([_, allowedValues]) => Array.isArray(allowedValues)) .every(([field, allowedValues]) => { if (!sess.hasOwnProperty(field)) return false; // 把可选值统一转字符串后判断当前字段值是否在可选范围内 const formattedAllowed = allowedValues.map(val => val.toString()); return formattedAllowed.includes(sess[field].toString()); }); }); };
效果验证
以你给出的示例参数为例,筛选后会返回同时满足Category为Communications and Media/Education且Role为Analyst的两条记录(ID为1111、2222),完全符合AND逻辑的要求。
内容的提问来源于stack exchange,提问作者n8tron
相关产品推荐
相关产品推荐

