2016-06-20 4 views
1

私のノードアプリケーションに2つの大きな配列があります。JavaScriptのフィルタが遅い

var styles = [{itemID:..., styleID:..., styleNum:..., otherFields...}]; // 42455 items 
var products = [{productID:..., styleNum:..., otherFields...}]; // 72K items 

私は製品をループし、スタイル配列から関連するstyleIDを取得し、新しい項目を新しい配列に追加する必要があります。 styles配列はstyleNumでソートされます。ここで私が試したものです:

var i=0, len = products.length, items = new Array(products.length); 
for (i = 0; i < len; i++) 
{ 
    var workingItem = products[i]; 
    var styleID = filterStyles(workingItem.styleNum)[0].styleID; 
    var item = {styleID:..., other fields}; 
    items[i]=item; 
} 

...

function filterStyles(styleNum) 
{ 
    var results = []; 
    var item; 
    for (var i = 0, len = createdStyles.length; i < len; i++) 
    { 
     item = createdStyles[i]; 
     if (item.styleNum == styleNum) results.push(item); 
    } 
    return results; 
} 

これは私の物の配列から100以上のアイテムを反復するために1秒を要し、非常に遅いです。私はasyc.eachを使って同じことを試みましたが、同じ応答時間を得ました。 フィルタ機能を削除すると、高速に点灯します。フィルタ機能を改善する方法はありますか?

+0

はなぜネイティブ 'Array.prototype.filter'機能を使用しないで行うことができますか? –

+0

@MikeMcCaughanパフォーマンスがどのように役立つでしょうか? –

+0

@MikeMcCaughanネイティブフィルタ機能が遅い。 –

答えて

4

O(n2)のたびにアレイをスキャンしないようにするには、styleNumでキーを作成します。

var styleNumMap = Object.create(null); 
styles.forEach(function(style) { 
    if (!styleNumMap[style.styleNum]) { 
     styleNumMap[style.styleNum] = []; 
    } 
    styleNumMap[style.styleNum].push(style); 
}); 

次に、あなただけの

var i=0, len = products.length, items = new Array(products.length); 
for (i = 0; i < len; i++) 
{ 
    var workingItem = products[i]; 
    var styleID = styleNumMap[workingItem.styleNum][0].styleID; 
    var item = {styleID:..., other fields}; 
    items[i]=item; 
} 
+0

今しよう。まもなく報告します。 –

+0

ブリリアント。これは驚くほど速く動作します。 –

+0

リトルタイプです。 styleNumMap [styleNum] .push(style); styleNumMap [style.styleNum] .push(style)でなければなりません。 –

関連する問題