2012-11-26 10 views
15

のは、私はこのようなオブジェクトの巨大な(1000 +)のリストを持っていると仮定しましょう:JavaScriptでJSONオブジェクトのリストをフィルタリングする最高のパフォーマンス方法は何ですか?

[{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..] 

は、私は名前(文字賢明)で、このリストをフィルタリングします。

filter('j') => [{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..] 

filter('jo') => [{name: 'john dow', age: 38, gender:'m'}, ..] 

filter('dow') => [{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..] 

これを行うには最高のパフォーマンス方法はありますか? RegExは、ユーザーが通常最初から名前を始める傾向があると想定している場合は、あらかじめリストを並べ替えることをお勧めしますが、場合によっては役立ちます。

フィルタをマッピングするJavaScript組み込み関数はありますか?私はそれらがJavaScriptの実装よりも速いことを期待しています。

P.S .:はい私は提供したい "オフライン機能"のためにクライアント側でフィルタしたいと思います。 substring index(例えばSuffix treeとしては)この速くなるだろうが

+3

実際にJavaScriptのオブジェクトであれば、もはやJSONではありません。 「JSON」は、ネットワーク全体にその情報を転送するための記法(または場合によってはそれを格納するための表記)です。 JavaScriptプログラムの中では、単純に「JavaScriptオブジェクト」です(エンコードされたJSONデータが含まれている文字列について話している場合を除き、その場合はJavaScriptオブジェクトに変換してから使用する必要があります)。 –

+0

"ohn"を検索するとどうなりますか? –

+0

@JoachimSauerあなたは正しいです..私はそれを修正しました;) フィルター( 'ohn')=> [{name: 'john dow'、年齢:38、性別: 'm'}、..] – wzr1337

答えて

10

、直接検索は次のようになります。

function (s, l) { 
    return l.filter(function (v) { 
     return v.name.find(s) !== -1; 
    }); 
} 
sは、クエリ文字列で

lは、オブジェクトのリストです。

+2

まっすぐなforループは、ネイティブフィルタの少なくとも2倍の速さです。 https://jsperf.com/array-filter-performance – Mrchief

+0

@ Dan D.サブストリング索引があります。例を挙げることは可能ですか?私はオフライン検索機能を持つ同様のアプリケーションを持っています。現在200,000個のオブジェクトを検索するのに、通常の '.filter()' – mesqueeb

9

経験から、次のアルゴリズムは非常にうまく機能:

  1. ユーザータイプの最初の文字は、あなたがどのようなユーザーの種類(例えば、「J」の下になり、おそらくArray.filter()を使用して検索し、ストアを実行すると);

  2. すると、ユーザの削除を通過するアイテムの数を減らすこと

  3. ユーザータイプ別の文字(例えば「O」)は、あなたが(「J」)の前に入力したものは何でも上の検索を実行します、 1つまたは複数の文字を検索ボックスに残っているものに基づいてストアド検索を検索しようとします。すべてが失敗した場合は、空のリストを表示し、以前に保存した検索を無効にします。

+0

で十分高速ではありません。このパターンを実装するライブラリ/コードサンプルは共有できますか? –

+0

私はこれが非常に良いアプローチだと思っています...あなたはすぐに使えるライブラリを知っていますか? –

4

この場合、パフォーマンスはあまり気にしません。デスクトップコンピュータは、汗をかくことなく1000回、または10,000回の評価を食べる必要があります。複雑な最適化を避けるのは、機能を破る危険性が多少なりとも効率的な処理のメリットよりも高いからです。

JavaScript(ECMAScript 5)は、配列をフィルタリングするための新しいメソッドを提供します。ネイティブメソッドとして、少し早くなるはずです。

var regex = ... 

results = json.filter(function(result) { 
    return regex.test(result.name) 
} 

Array.prototype.filterは、現代のブラウザでサポートされ、http://kangax.github.com/es5-compat-table/を参照してください。 古いブラウザ用のパッチは、次のように追加できます。https://github.com/kriskowal/es5-shim

関連する問題