JavaScript中根据多对象真值条件实现数组数据筛选
多维度财经日历筛选实现方案
实现逻辑
- 先预处理所有筛选维度:提取每个维度下被选中的选项值,如果某个维度没有任何选中项(配置值全为false),直接跳过该维度,不做校验
- 遍历原始数据,对单条数据依次校验所有启用的筛选维度:数据对应字段的值属于该维度选中值范围,即判定为通过该维度校验
- 只有全部启用维度都校验通过的数据,才会被纳入最终返回结果,维度之间为「且」的匹配关系
可复用实现代码
/** * 通用多维度筛选函数 * @param {Array} source 原始待筛选数据集 * @param {Object} filterMap 筛选配置映射,键为数据对应字段名,值为该维度的选中配置对象 * @returns {Array} 筛选后结果集 */ function filterData(source, filterMap) { // 生成有效筛选规则 const activeRules = {} for (const [field, config] of Object.entries(filterMap)) { const selected = Object.entries(config) .filter(([, checked]) => checked) .map(([val]) => val) if (selected.length) activeRules[field] = selected } // 无有效规则直接返回原数据副本 if (!Object.keys(activeRules).length) return [...source] // 执行过滤 return source.filter(item => { return Object.entries(activeRules).every(([field, allowValues]) => { return allowValues.includes(item[field]) }) }) }
调用示例
对应提供的测试数据和筛选配置,调用方式如下:
// 传入原始数据和各维度配置 const result = filterData(data, { country: countrys, day: days, impact: impacts }) // 输出结果为预期的id=26201的第一条记录 console.log(result)
扩展说明
- 该实现为通用逻辑,后续新增筛选维度(比如事件分类、时间范围等)时,只需要在调用
filterData时传入对应字段名和配置对象即可,无需修改核心过滤代码 - 完全匹配规则要求:未选中任何选项的维度会自动跳过,不会出现空筛选导致结果为0的问题;启用的维度之间为严格的且关系,和主流财经日历的筛选交互逻辑一致
内容的提问来源于stack exchange,提问作者soykot2910
相关产品推荐
相关产品推荐

