2016-03-29 10 views
3

2つの配列を一緒に「マッピング」するよりefficentの方法Iは、(私はいくつかのユーザー入力に基づいて、サーバから受信する)2つのオブジェクトの配列を有する:両方の配列にのJavascript -

array1 = [{id:1, name:Bob}, {id:2, name:John}, {id:3, name:Mary}]; 
array2 = [{id:2, field:true},{id:2, field:true}, {id:3, field:false}]; 

IDを互いに対応(ユーザーIDです)。実際の生活では、これらの配列ははるかに大きくなります(配列1では8000要素まで、配列2では16000まで)。

私が達成する必要があるのはフロントエンドです。私は現在、ユーザーIDとフィールドに表示されているarray2情報を表示しています。問題はフロントエンドユーザーが自分のユーザーIDで誰かを知らず、名前で知っていることです。私はこのようなオブジェクトを持つ配列が必要です:{id:'',name:'',field:''}

私が最初に考えたのは、「二つの配列を組み合わせた」新しい配列を作成してすることでした:

var new_array = []; 

for (var i = 0; i < array2.length; i++) { 
    var name = 'Unknown'; 
    for (var j = 0; j < array1.length; j++) { 

    if (array1[j].id === array2[i].id) { 
     name = array1[j].name; 
    } 

    this.new_array.push({ 
     id: array2[i].id, 
     name: name, 
     field: array1[j].field 
    }); 
    } 
} 

だから私二番目の配列をループし、idは最初のアレイのIDと一致するかどうかを確認します。もしそうであれば、私は最初の配列から名前を取ります。それがユーザーの名前ですので、ユーザーの名前を取得します。

これは機能しますが、フロントエンドでは遅いですが、これを行うには数秒かかります。多くのアイテムがある場合は、ユーザーエクスペリエンスが気に入らず、待っています。私は私がする必要があることをするより効率的な方法を探しています。

+1

あなたの例では、 'array1'のインデックスはそれらのIDと一貫しています(offで1の場合)。あなたの実際の配列でこれは本当ですか? –

+0

はい、インデックスとIDには何も共通点がありません。実際には、ユーザーIDは8桁の数字であり、配列1ではサーバーから任意の順序で返すことができます。 – user2924127

+0

投稿したコードは、array2のすべての値に対して新しい値をnew_arrayにプッシュし、それぞれの値に対してarray1のすべての値をプッシュします。したがって、 'new_array'の長さは' array1.length * array2.length'、またはサンプル番号、 '8000 * 16000'または12800万エントリを使用することになります。それは実際にどのように動作するのですか、あるいはあなたは実際には単に "id"の値をマージしてマージしたいのですか? – Pointy

答えて

3

1つのアレイを介して実行し、エントリにID値をマッピングするオブジェクトを作成します。

var new_array = []; 
for (var i = 0; i < array1.length; i++) { 
    var v2 = array2idx[array1[i].id]; 
    if (v2) { 
    new_array.push({ 
     id: v2.id, 
     name: array1[i].name, 
     field: array1[i].field 
    }); 
    } 
} 

かなり速くする必要があります:

var array2idx = array2.reduce(function(map, value) { 
    map[value.id] = value; 
    return map; 
}, {}); 

を今、あなたは簡単な検索でarray2値を見つけることができます。インデックスオブジェクト内のIDを調べるには、ほとんど時間がかかりません。

+0

このサンプルコードでは、OPが本当に望むのは、2つの配列間でSQLの 'JOIN'演算のような処理を行うことです。 "id"プロパティで質問のコードはクロスプロダクトを実行しますが、実際にはそれが望ましいとは思えません。 – Pointy

+1

簡略化すると、この解は元のO(n * m)と比較してO(n + m)です。 –

+1

これはありがとうございますそれははるかに良い作品! – user2924127