我正在寻找在循环内生成动态生成条件的最佳方法。
一个值(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/