过滤一次或过滤多次

时间:2016-06-02 08:20:08

标签: javascript algorithm code-complexity

我有一个包含对象的数组:

objects = [a, b, c, ...]

我有许多函数可以为给定对象返回true / false

functions = [f1, f2, f3, ...]

现在我想获得所有传递所有功能的对象。什么是最有效的?

functions.forEach(function(f) {
       objects = objects.filter(f);
})

OR

objects = objects.filter(function(o) {
       functions.forEach(function(f) {
            if(!f(o)) return false;
       })
})

我不确定什么是最有效的,这取决于过滤功能有多重?它们是一样的吗?

2 个答案:

答案 0 :(得分:1)

在这两种情况下,你为每个函数调用objects.filter,复杂性是相同的。如果对前一个过滤器的结果使用filter而不是每次都在所有对象上应用它,则可以稍微优化一下。

for (f in functions){
    objects = objects.filter(functions[f])
}

如果可能,按时间复杂度对函数进行排序返回True(升序)的概率。

答案 1 :(得分:1)

我做了一点测试:

  console.time("Creating objects");
  var objects1 = [];
  var objects2 = [];
  while (objects1.length < 20000) {
    var value = 1000 * Math.random();
    objects1.push({ value: value });
    objects2.push({ value: value });
  }
  console.timeEnd("Creating objects");

  console.time("Creating functions")
  var functions = [];
  while (functions.length < 1000) {
    var rnd_value = 1000 * Math.random();
    functions.push(function(o) {
        return o.value >= rnd_value;
    });
  }
  console.timeEnd("Creating functions")

  console.time("Functions outer")

  functions.forEach(function(f) {
    objects1 = objects1.filter(f);
  });

  console.timeEnd("Functions outer");

  console.time("Filter outer")

  objects2 = objects2.filter(function(o) {
    var ret = true;
    functions.forEach(function(f) {
      if (ret && !f(o)) ret = false;
    });
    return ret;
  });

  console.timeEnd("Filter outer");

控制台的结果是:     外部功能:3188.918ms     过滤器外部:454.249ms

所以我假设数组中的过滤函数在javascript中非常重要。换句话说,我应该尽可能多地调用它。