javascript - 动态生成条件JS

标签 javascript

我正在寻找在循环内生成动态生成条件的最佳方法。

一个值(value)千字的样本,所以这是我的代码:

var condition = "data.label == 'Test'";

for (var key in andArray) {
    condition += "&& " + andArray[key];
}

for (var key in orArray) {
    condition += "|| " + orArray[key];
}

var length = dataArray.length;
var result = [];
for (var i = 0; i < length; i++) {
    var data = dataArray[i];
    if (eval(condition)) {
        result.push(obj);
    }
}

我使用了 eval() 函数,它运行良好,但实在是太慢了!对于 200 个元素的数组,此代码需要 25 毫秒才能执行! 这实在不行,要知道我要在有几千个元素的数组上用这种东西。

您是否有想法以另一种方式更快地做到这一点?

最佳答案

我想推荐一个完全不需要字符串操作的替代解决方案。相反,您可以组合功能。通过函数组合而不是字符串操作来构建代码应该更不容易出错 - 并且肯定不会那么“hacky”(不管这到底意味着什么......)。

Javascript 具有一阶函数,您可以传递(和组合)谓词。谓词是一个返回 bool 值的函数。例如:

var isLabelTest = function(obj) {
  return obj.label === 'test';
}

您可以将条件存储为谓词函数,而不是将条件存储为字符串。
然后你可以写一些接受谓词并返回新谓词的函数:

var binaryAnd = function(predA, predB) {
  return function(obj) {
    return predA(obj) && predB(obj);
  };
};

var binaryOr = function(predA, predB) {
  return function(obj) {
    return predA(obj) || predB(obj);
  };
};

您还可以编写接受谓词数组并将数组中的所有谓词组合成一个新谓词的函数:

var and = function(preds) {
  return preds.reduce(binaryAnd, function(obj) {return true;});
};

var or = function(preds) {
  return preds.reduce(binaryOr, function(obj) {return false;});
};

现在给定一个所有需要返回 true 的谓词“andArray”,以及一个至少有一个需要返回 true 的谓词“orArray”,以下代码完成了这项工作:

var results = [];
var combinedPredicate = binaryAnd(and(andArray), or(orArray));
var pushIfCondition = function (obj) {
  results.push(combinedPredicate(obj));
};
dataArray.forEach(pushIfCondition);

最后,请注意,没有必要自己编写那些用于组合谓词的函数,像ramda 这样的库。可以提供更高效的实现。

关于javascript - 动态生成条件JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38704759/

相关文章:

javascript - 在javascript中获取比选定的键更多的内容

javascript - 使用 DocumentFragment 和 innerHTML 通过富文本注释存储 XSS 预防

javascript - 将 await 与 jsmediatags 结合使用

javascript - Angular2 服务返回未定义

php - JSON 的双重编码

javascript - HTML5 Canvas 与 Javascript ,图像加载

javascript - 如何在angularjs中对json数据进行分组

javascript - 在焦点文本字段中显示工具提示,Ext JS 3.4

javascript - C3 带百分比的图表栏

javascript - html margin 问题 - "Shaking"网站