Javascript动态IF regex条件不带eval?

Javascript动态IF regex条件不带eval?,javascript,jquery,regex,filtering,eval,Javascript,Jquery,Regex,Filtering,Eval,我将多组复选框过滤(多个无序的复选框列表)添加到web应用程序中,我一直在尝试使用eval(或者在这种情况下我不应该担心?)。基本上,数据是通过一个AJAX调用调用的,我将数据存储在一个对象数组中,并在不进行额外AJAX调用的情况下进行实时过滤。选中复选框时,我使用的是.match(),基本上是将正则表达式创建为数组中的字符串值(k是类别对象属性,例如category1): 过滤器数组设置在其上方的一个循环中,看起来如下所示(v是实际的字符串值-类别名称): 然后我加入filterArgs: r

我将多组复选框过滤(多个无序的复选框列表)添加到web应用程序中,我一直在尝试使用eval(或者在这种情况下我不应该担心?)。基本上,数据是通过一个AJAX调用调用的,我将数据存储在一个对象数组中,并在不进行额外AJAX调用的情况下进行实时过滤。选中复选框时,我使用的是.match(),基本上是将正则表达式创建为数组中的字符串值(k是类别对象属性,例如category1):

过滤器数组设置在其上方的一个循环中,看起来如下所示(v是实际的字符串值-类别名称):

然后我加入filterArgs:

return filterArgs.join(' && ');
filterArgs当前通过eval传递给if语句条件,如下所示:

if(eval(filter_setup())){
function checkFilters(data, filters) {
    for (var k in filters) {
        if (!(new RegExp(filters[k].join("")).test(data[k])))
            return false;
    return true;
}
if (checkFilters(data, filters)) {
    ...
}
因此,如果if语句为true,则主数据数组中的正确对象将包含在过滤后的数据集中。我可能会切换到jQuery的$.grep而不是if语句,但我仍然遇到相同的eval问题。有没有其他方法可以构建动态正则表达式?eval可以很好地工作,但我读过所有的文章都说它有多“邪恶”。if语句条件最终看起来如下所示(第一组中选中2个框,另一组中选中1个框):


尽可能避免
eval
。在这种情况下,绝对没有必要

在需要时存储
过滤器
对象,并定义如下内容:

if(eval(filter_setup())){
function checkFilters(data, filters) {
    for (var k in filters) {
        if (!(new RegExp(filters[k].join("")).test(data[k])))
            return false;
    return true;
}
if (checkFilters(data, filters)) {
    ...
}
所以你可以这样使用它:

if(eval(filter_setup())){
function checkFilters(data, filters) {
    for (var k in filters) {
        if (!(new RegExp(filters[k].join("")).test(data[k])))
            return false;
    return true;
}
if (checkFilters(data, filters)) {
    ...
}
顺便说一下,使用构造函数创建
RegExp
对象的成本很高。如果需要更快的速度,可以预编译筛选器并保留它们,而不是保留一系列条件:

filters[k] = new RegExp(filters[k].join(""));
此外,正如Dave指出的,根据您的数据,您可能需要退出过滤器:

filters[k][z] = '(?=.*\\b'
        + v[z].replace(/([\^\$\/\.\*\+\?\|\(\)\[\]\{\}\\])/g, "\\$1")
        + '\\b)';

您可以推送函数,而不是推送表达式:

 filterArgs.push(function(k){
   var re = new RegExp(filters[k].join('') + ".+");
   return function(data){
     return data[k].join(', ').match(re);
   }
 });
现在,您可以执行函数而不是计算字符串:

 for(var cond = true, i = 0; cond && i < filterArgs.length; i++) {
   cond &= filterArgs[i](data);
 }
for(var cond=true,i=0;cond&&i
这听起来确实像是XY问题。您可以使用内置的RegExp构造函数构建动态regex。^^^我的想法是,直接将字符串传递给RegExp。不要忘记在用户输入中转义
()[[]{}\*+^$。?
。是的,您正在构建的FilterArg不是一种方法;只需在循环中一次运行一个ifs;如果任何返回为false,则返回false。不需要评估。顺便说一句,eval从来都不是可以原谅的,除非你真的知道自己在做什么,并且正在解决大约3个问题中的一个(即使在这种情况下,通常最好还是编写自己的解释器)谢谢。逃离过滤器是我的下一步,所以很高兴你也包括了它。我测试了一点,它实际上没有按照我希望的方式工作。使用此方法,过滤似乎仅基于其中一个过滤器组进行过滤。如果选择了来自不同组的过滤器,它只基于第一个过滤器组进行过滤。好的,我想我已经解决了我在前面的评论中提到的问题。我没有从for循环返回,而是将循环上方的布尔变量设置为true,如果RegExp失败,则将其设置为false,然后在循环之后返回布尔值(如果为true)。