如何在javascript中优化此过滤?

时间:2017-01-10 16:33:30

标签: javascript optimization

我有一个来自json文件的大对象(在下面的代码中称为" container")。该对象包含许多元素(大约20 000个),每个元素都是一个具有" rank"属性。它在这里打印太大了,但这里有一个结构相同的对象:

{
    guy1: {rank:0, infos:"the first guy ever"},
    guy0: {rank:2, infos:"another guy"},
    something: {rank:1, infos:"something else"}
}

首先,我想将其中10个列表中的最小等级放入列表中(在我使用我在此处调用的函数 modify 稍微修改它们之后),所以我做了:

var res = [];
for (var key in container) {
    if (container.hasOwnProperty(key) && container[key]["rank"]<10) {
        res.push(modify(container[key]));
    }
}

但现在我想 do_something ,其中10个排名最小,但仅限于那些传递 my_test 的人。我能做到:

var res = [];
var filt_cont = Array.from(container).filter(my_test);//actually this doesn't work. I currently use a long non-efficient way to do that but i guess I can find something better on my own)
for (var key in filt_cont) {
    if (filt_cont.hasOwnProperty(key) && filt_cont[key]["rank"]<10) {
        res.push(modify(filt_cont[key]));
    }
}

但是我希望我的代码尽可能快,我想知道是否有更快的方法来做到这一点。此外,我希望在通过测试的人中保持10个最佳(排名最小),这只会给那些在过滤器之前的前10个并通过过滤器的人。

相关的, my_test 是四个比较,两个属性读数和修改是6个属性读数和2个int添加。

1 个答案:

答案 0 :(得分:1)

最后我接受这个:

var filt_cont = []
for (var key in container) {
    filt_cont[container[key]["rank"]] = container[key]
}
filt_cont = filt_cont.filter(my_test)
return filt_cont[0:9]

工作得足够快,显然创建这样的列表,按索引添加项目,并不算太贵。

我注意到,如果 undefined 会传递 my_test ,这可能是一个问题,但事实并非如此, p>