4

2セットのオブジェクトがあるとしましょう

set1 = [{'id':'1', 'x':'1', 'y':'2'}, {'id':'2', 'x':'2', 'y':'2'}]
set2 = [{'id':'1', 'z':'1'}, {'id':'2', 'z':'2'}]

欲しいもの:

set3 = set1.join(set2).on('id'); 

>> set3 
[{'id':'1', 'x':'1', 'y':'2', 'z':'1'},{'id':'2', 'x':'2', 'y':'2', 'z':'2'}]

この機能を実現するための適切なツールは何ですか? ここunderscoreで役立つでしょうか?

4

3 に答える 3

3

オプション 1、プレーン js

各リストを ID ごとのセットに変換することをお勧めします。

{1: {x: 1, y: 1}, 2: {x: 2, y: 2}}

次に、セットの 1 つ (または両方) に対して for を実行し、これら 2 つの属性を使用して新しい辞書を作成します。この後者の部分は、内部結合と外部結合のどちらを探しているかによって異なります。これにより、ほぼ線形のランタイムが得られるはずです。辞書の JavaScript 実装は非常に効率的です。

オプション 2、アンダースコア、密な ID セットの場合、_.zip() を使用

が比較的密集しており、外部結合が必要な場合id、または ID のセットがまったく同じであることを事前に知っている場合、別のオプションとして、データを 3 つの配列 (属性ごとに 1 つ) に詰め込み、アンダースコアを使用します。 zip() メソッド。

オプション 3、アンダースコア、_.groupBy() を使用

カスタム比較メソッドを使用してリストで _.groupBy() を実行するさらに別の可能性。これにより、複数のキーで結合することもできます。ただし、直接の結果は次の形式の辞書になるため、簡単な後処理が必要になります。

{1: [{'id':'1', 'x':'1', 'y':'2'}, {'id':'1', 'z':'1'}],
 2: [{'id':'2', 'x':'2', 'y':'2'}, {'id':'2', 'z':'2'}]}

後者の場合の内部結合動作は、リスト内の項目の最大数 (例では 2) を持たない、結果の辞書内の項目を除外することによって実現できます。

于 2012-08-18T10:01:20.797 に答える
3

オプション 4: Alasqlライブラリ

Alasql は「SQL 方式」で 2 つのテーブルを結合できます。

var set1 = [{'id':'1', 'x':'1', 'y':'2'}, {'id':'2', 'x':'2', 'y':'2'}];
var set2 = [{'id':'1', 'z':'1'}, {'id':'2', 'z':'2'}];

var res = alasql('SELECT * FROM ? set1 JOIN ? set2 USING id',[set1, set2]);

それはあなたが必要とするものを正確に提供します:

[{"z":"1","id":"1","x":"1","y":"2"},{"z":"2","id":"2","x":"2","y":"2"}]

この例を jsFiddle で試してください。

于 2014-12-18T03:37:56.690 に答える