Javascript动态IF正则表达式条件没有eval?

标签 javascript jquery regex filtering eval

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

filterArgs.push("(data['" + k + "'].join(', ').match(/" + filters[k].join('') + ".+/))");

过滤器数组在上面的循环中设置,它看起来像这样(v是实际的字符串值 - 类别名称):

filters[k][z] = '(?=.*\\b' + v[z] + '\\b)';

然后我加入filterArgs:

return filterArgs.join(' && ');

filterArgs 当前通过 eval 传递给 if 语句条件,如下所示:

if(eval(filter_setup())){

因此,如果该 if 语句为 true,则主数据数组中的正确对象将包含在过滤后的数据集中。我可能会切换到 jQuery 的 $.grep 而不是 if 语句,但我仍然遇到相同的 eval 问题。还有其他方法来构建动态正则表达式吗?它与 eval 一起工作得很好,但我读过所有的文章都说它是多么“邪恶”。 if 语句条件最终如下所示(第一组中选中 2 个框,另一组中选中 1 个):

(data['type'].join(', ').match(/(?=.*\bRestaurant\b)(?=.*\bBar\b).+/)) && (data['state'].join(', ').match(/(?=.*\bWashington\b).+/))

最佳答案

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

在需要时存储filter对象并定义如下内容:

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(""));

此外,正如戴夫指出的,根据您的数据,您可能需要逃避过滤器:

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

关于Javascript动态IF正则表达式条件没有eval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23709128/

相关文章:

php - 获取分隔符后到行尾的字符串

javascript - REGEX (javascript) - 允许带有特殊字符的字母数字字符不在第一个位置

python - 命名组内的非捕获组

Javascript - 多次循环同一数组

javascript类似Date对象,返回不同的纪元?

javascript - 使 div 跟随文本区域中的插入符号位置?

jquery - 从 jQuery Grid 插件将额外参数传递给 ASP.NET MVC Controller 操作

javascript - 如何在html中用javascript将客户的数据动态加载到表中

javascript - Chrome 扩展 - 通过刷新页面保存整个网站的设置

javascript - 如何获得绑定(bind)到 onclick 属性的函数?