首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript ()方法在过滤时降低性能

javascript ()方法在过滤时降低性能
EN

Stack Overflow用户
提问于 2015-04-21 08:37:04
回答 2查看 441关注 0票数 1

我正在从一个过滤器数组中创建一个where子句的字符串。

代码语言:javascript
复制
var where_clause_string = "(((true && ['SACRAMENTO','CITRUS HEIGHTS'].indexOf(raw_data[i]['city']) > -1) || (false && [].indexOf(raw_data[i]['city']) === -1)) || false)";
var raw_data_length = raw_data.length
  , filtered_data = [];
for(var i = 0; i < raw_data_length; i++) {
  if (eval(where_clause_string)) {
    filtered_data.push(raw_data[i]);
  }
}

然后,我将遍历作为对象数组的数据,并且只返回通过真相测试的对象。

它给出了预期的结果,但性能是失败的。只过滤1500行就需要2-3秒。如果条件是硬编码的,而不使用eval(),则处理非常快。

实现这一目标的替代办法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-21 08:41:27

另一种办法是建立一种功能:

代码语言:javascript
复制
var where_clause_string = "(((true && ['SACRAMENTO','CITRUS HEIGHTS'].indexOf(raw_data[i]['city']) > -1) || (false && [].indexOf(raw_data[i]['city']) === -1)) || false)";

var evaler = new Function('raw_data', 'i', "return "+where_clause_string);

var raw_data_length = raw_data.length
  , filtered_data = [];
for(var i = 0; i < raw_data_length; i++) {
  if (evaler(raw_data, i)) {
    filtered_data.push(raw_data[i]);
  }
}

如果您想更进一步,可以使用filter函数Array.prototype。它还将确保函数生成不会成为去优化的可能原因(请参阅优化杀手):

代码语言:javascript
复制
var where_clause_string = "(((true && ['SACRAMENTO','CITRUS HEIGHTS'].indexOf(raw_data[i]['city']) > -1) || (false && [].indexOf(raw_data[i]['city']) === -1)) || false)";

var filtered_data = raw_data.filter(new Function(
    'v', "return "+where_clause_string.replace(/raw_data\[i\]/g,'v')
));

但是,通常最好从结构化数据开始,而不是想要计算的原始字符串。按照我的建议使用函数可以获得更好的性能,但仍然会遇到字符串中代码的维护、可读性和安全性问题。也许这可能是

代码语言:javascript
复制
var criterium = {
    ok_cities:['SACRAMENTO','CITRUS HEIGHTS'],
    nok_cities:[]
};
票数 6
EN

Stack Overflow用户

发布于 2015-04-21 09:09:47

代码语言:javascript
复制
var raw_data_length = raw_data.length,
    filtered_data = [];
for (var i = 0; i < raw_data_length; i++) {
    // fill all param with values some may filled above the for statement
    var param1 = true,
        param2 = ['SACRAMENTO', 'CITRUS HEIGHTS'].indexOf(raw_data[i]['city']) > -1,
        param3 = false,
        param4 = [].indexOf(raw_data[i]['city']) === -1,
        param5 = false;

    if (param1 && param2 || param3 && param4 || param5) {
        filtered_data.push(raw_data[i]);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29766991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档