2017-01-10 2 views
2

私はjsonファイルから大きなオブジェクト(以下のコードでは "container"と呼ばれます)を持っています。このオブジェクトには、多くの要素(約20000)が含まれています。各要素は、「ランク」プロパティを持つオブジェクトです。ここでそれを印刷するには大きすぎるが、ここでは同じ構造を持つオブジェクトです:javascriptでこのフィルタリングを最適化する方法は?

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

まず私は少しでそれらを修正した後、私は、リスト内の最小のランク(とそれらの10を置くことを望んでいました

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

しかし、今、私はだけmy_test に合格した者の中で最も小さいランクでそれらの10とをdo_something にしたい:私は)を変更ここで呼び出すので、私がした機能

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関連のIT

は、4つの比較と二つの属性の測定値とは6個の属性の読み取り値と2件のint型の追加をで修正しています。

+0

*オブジェクトには多くの要素が含まれています(約20000)*、hm、配列ですか?または単にこの使用法のために偽のデータ構造ですか? –

+0

いいえ、それはjsonの辞書(非ソート済み)から解釈されるオブジェクトですが、私はそれがどのように見えるかの小さな例を追加します、それはより明確になります。 –

+0

'container.hasOwnProperty(key)&&'を削除してください。それは不要で時間がかかります。 – Bergi

答えて

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] 

は明らかに、このようなリストを作成し、十分に速く動作し、そのインデックスで項目を追加、あまりにも高価ではありません。

私は未定義が問題になる可能性があるmy_testを渡すだろうが、そうではないとして、それは大丈夫だ場合ことに注意してください。

関連する問題