我有一个来自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添加。
答案 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>