2017-01-06 5 views
0

Javascript Objectsが2つあると仮定します(これらはJSON構造ですが、JSON.parse()で作成されます)。すべてのエントリには、両方のオブジェクトのエントリを一致させるユニークなIDがあります。 両方のオブジェクト(ネイティブjavascript)を結合する最も速い方法は何でしょうか。IDで2つのJavascript/JSONオブジェクトを結合する最速の方法

私の頭に浮かぶ最初のものは、入れ子になったfor in loopです。

for(var i in firstJson) { 
    for(var j in secondJson) { 
     if(firstJson[i].id === secondJson[j].id) { 
      // join them 
     } 
    } 
} 

速い方法がありますか?

+0

常に1対1ですか? – Jorg

+0

@Jorg 2つの提案があるといいですね。最初に、 'secondJson'の' firstJson'からすべての要素を見つけて、もう1つでは、すべてを見つけることができないということです。 – Stophface

+0

速度を上げるために追加できる小さなもの:ifに 'break'を追加します.2番目の要素が見つかるとすぐに他のオブジェクトをスキップします。 2番目に、すでにマージされている 'secondJson'の要素を削除します。次のループは少し速くなります。 – rpadovani

答えて

4

もっと効率的な方法は、それらのいずれかのうち、インデックスを作成するには、次のようになります。

var index = {}; 
for (var j in secondJson) { 
    var obj = secondJson[j]; 
    index[obj.id] = obj; 
}; 

for (var i in firstJson) { 
    var firstObj = firstJson[i]; 
    var match = index[firstObj.id]; 
    if (match) { 
     // do the stuff 
    } 
}; 

これはO(n+m)の代わりに、ネストされたループのO(n*m)です。もちろん、メモリはO(m)である。

+0

これは良い解決策の1つです。配列としてオブジェクトアクセサを使用する。 – Nirus

0

両方のリストがまだソートされていない場合は、最初にIDでソートしてから比較し、最後に見つかったオブジェクトの位置を保存します。

(私は気まぐれからソリューションが高速であると信じていますが、これは余分なメモリ消費を持っていない)

これは、オーダーO(nはログ(N)+ Mログ(M)+にする必要がありますm)

first.Sort(); 
second.Sort(); 


int idx = 0; 
int lastIdx = 0; 
for (int i = 0; i < first.Count; i++) { 
    for (int j = idx; j < second.Count; j++) 
    { 
    if (first[i] == second[j]) 
    { 
     Console.WriteLine("equal " + first[i]); 
     idx = j + 1; 
     lastIdx = idx; 
     break; 
    } 
    } 
    if (idx == second.Count) 
    idx = lastIdx; 
} 
関連する問題