如何使用动态生成的值对二维数组进行多条件过滤?
动态多条件过滤二维数组
针对你的二维数组场景,完全可以不用eval()或者多次迭代过滤,我们可以通过配置化的条件定义结合数组的every()和some()方法来实现灵活的多条件组合(同一列OR、不同列AND),既安全又易维护。
场景1:同一列多值OR + 不同列AND(最常用)
如果你的需求是:processDescription是Adsorption或Desorption 并且 productID是PREC,可以按以下方式实现:
首先定义你的过滤条件配置——键是列的索引,值是该列允许的取值数组(数组内的元素是OR关系):
// 配置条件:列索引 => 允许的取值(OR逻辑) const filterConditions = { 5: ['Adsorption', 'Desorption'], // processDescription列:匹配任意一个值 6: ['PREC'] // productID列:必须匹配该值 };
然后执行过滤:
filtered_data = filtered_data.filter(row => { // 所有列的条件都要满足(AND逻辑) return Object.entries(filterConditions).every(([colIndex, allowedValues]) => { const currentValue = row[parseInt(colIndex)]; // 检查当前行的该列值是否在允许列表中(OR逻辑) return allowedValues.includes(currentValue); }); });
场景2:复杂组合条件(多个AND组之间OR)
如果你的需求是更复杂的逻辑:processDescription是Adsorption 或者 processDescription是Desorption且productID是PREC(也就是你写的result[5] === 'Adsorption' || result[5] === 'Desorption' && result[6] === 'PREC'),可以用分组配置来实现:
// 配置条件组:每组内是AND逻辑,组与组之间是OR逻辑 const filterGroups = [ { 5: ['Adsorption'] }, // 组1:仅需processDescription为Adsorption { 5: ['Desorption'], 6: ['PREC'] } // 组2:processDescription为Desorption且productID为PREC ]; filtered_data = filtered_data.filter(row => { // 满足任意一个条件组即可(OR逻辑) return filterGroups.some(group => { // 组内所有列条件必须满足(AND逻辑) return Object.entries(group).every(([colIndex, allowedValues]) => { const currentValue = row[parseInt(colIndex)]; return allowedValues.includes(currentValue); }); }); });
为什么这个方案更好?
- 无安全风险:完全避免了
eval()带来的代码注入问题; - 动态扩展性强:要添加新的过滤条件,只需修改配置对象/数组,不用改动过滤逻辑代码;
- 高效简洁:一次
filter遍历完成所有判断,不需要多次迭代过滤数组; - 可读性高:配置结构清晰,逻辑一目了然。
内容的提问来源于stack exchange,提问作者user142553
相关产品推荐
相关产品推荐

