0

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

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

我有许多函数为给定对象返回真/假

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

现在我想获取所有通过所有函数的对象。什么是最有效的?

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

或者

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

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

4

2 回答 2

1

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

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

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

于 2016-06-02T08:39:26.067 回答
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中非常繁重。换句话说,我应该尽可能少地调用它。

于 2016-06-02T08:55:53.583 回答