我有一个包含对象的数组:
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;
})
})
我不确定什么是最有效的,这取决于过滤功能有多重?它们是一样的吗?
答案 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中非常重要。换句话说,我应该尽可能多地调用它。