JavaScript 如何基于动态条件数组对目标数据集实现多条件筛选?
JavaScript动态多条件数组过滤实现方案
实现思路
- 预先创建运算符映射表,将每个判断运算符对应的比较逻辑封装为独立函数,后续新增运算符只需扩展该表即可
- 使用
Array.filter遍历待过滤的源数据集 - 对每条数据使用
Array.every校验所有筛选规则,只有全部规则都满足的数据才会被保留
完整实现代码
const conditionalArray = [ { name: "line", condition: ">=", value: 5 }, // 如需得到你给出的期望结果,可将第二条规则调整为如下配置 { name: "revene", condition: "<", value: 5 }, ]; const dataTofilter = [ { line: 3, revene: 4, sale: 3, fridge: "lg" }, { line: 6, revene: 3, sale: 2, fridge: "samsung" }, ]; // 运算符映射表,可按需扩展新的运算符规则 const operatorMap = { '>': (actual, expected) => actual > expected, '>=': (actual, expected) => actual >= expected, '<': (actual, expected) => actual < expected, '<=': (actual, expected) => actual <= expected, '==': (actual, expected) => actual == expected, '===': (actual, expected) => actual === expected, '!=': (actual, expected) => actual != expected, '!==': (actual, expected) => actual !== expected, // in运算符支持单个值、数组两种格式的对比值 'in': (actual, expected) => Array.isArray(expected) ? expected.includes(actual) : [expected].includes(actual), 'notIn': (actual, expected) => !operatorMap['in'](actual, expected) } /** * 动态多条件过滤方法 * @param {Array} data 待过滤源数据集 * @param {Array} conditions 筛选规则数组 * @returns {Array} 过滤后的结果集 */ function filterByConditions(data, conditions) { return data.filter(item => { return conditions.every(rule => { const actualVal = item[rule.name]; const compareFn = operatorMap[rule.condition]; // 未匹配到对应运算符时默认不保留该数据,可按需调整为跳过当前规则 if (!compareFn) return false; return compareFn(actualVal, rule.value); }) }) } // 调用方法 const result = filterByConditions(dataTofilter, conditionalArray); console.log(result); // 输出:[{ line: 6, revene: 3, sale: 2, fridge: "samsung" }]
扩展说明
如果需要支持更多筛选规则,比如字符串模糊匹配、范围判断等,只需在operatorMap中新增对应的运算符和处理逻辑即可,不需要修改核心过滤代码。
注:你原始给出的第二条筛选规则
{ name: "revene", condition: "in", value: 6 }与期望结果逻辑不匹配,两条测试数据的revene值分别为4、3,均不在[6]范围内,所以才调整为<规则来适配你的期望输出,可根据实际业务需求调整对应规则即可。
内容的提问来源于stack exchange,提问作者Singla
相关产品推荐
相关产品推荐

