2016-06-13 29 views
0

私は2つのダイナミックアレイを持っています。私は2つのマージを試みました。私はangular.extendと.concat関数を使用しました。しかし、それは私にとってはうまくいかない。誰もこれから私を助けることができますか?私のサンプル配列はここにありますangularjsで2つの配列をマージする方法は?

"first_data": [        
      [ 
       "JSP", 
       4463 
      ],    
      [ 
       "JAVA", 
       2022 
      ] 
     ], 



      "second_data": [        
      [ 
       "JSP", 
       2483 
      ], 
      [ 
       "HTTP CONNECTION", 
       43224 
      ], 
      [ 
       "JS", 
       27413 
      ] 
     ] 

私の出力はこのようになります。

"output_data": [        
      [ 
       "JSP", 
       4463, 
       2483 
      ],    
      [ 
       "JAVA", 
       2022, 
       null 
      ], 
      [ 
       "HTTP CONNECTION", 
       null, 
       43224 
      ], 
      [ 
       "JS", 
       null, 
       27413 
      ] 
     ] 
+3

これらの2つの機能のどちらも、期待していることはありません。私が知っている最も近いものは、Lodashの「uniq」メソッドですが、あなたが望むものはまったく行いません。あなたが追求しているロジックは標準的なマージではありません。何らかの種類のカスタム解析ロジックなしでソースデータ構造から派生することのできないテンプレートに結果データが欲しいとします。これを処理する関数を書く必要がありますが、私が言及したlodash関数を利用することができます。 –

+0

のロジックを使用せずに、このダイナミックマップの配列のようにマージするためのデフォルトメソッドがありますか? – VVijay

+0

ロジックを使用しないでください...いいえ。あなたは明らかにいくつかの比較を行う必要があります。それはキーとして共通のフィールドを持つオブジェクトを作成すると言っている – charlietfl

答えて

0

あなたが必要とするのは、関数型プログラミングの用語では、圧縮された配列として知られています。以下の関数は、あなたの例に従って配列を圧縮します。

は、ここでは、このvar newArray = zipArrays(arrays.first_data,arrays.second_data);

var zipArrays = function(array_one, array_two) { 

    //first take the first array and map any id from the second array to it 
    var result = array_one.map(

     function(arrayItem) { 
     //default setting = not found 
     var found = -1; 

     //search the second array for the current item in the first array 
     array_two.forEach(function(secondArrayItem, index) { 
      if (arrayItem[0] === secondArrayItem[0]) { 
      found = index; 
      } 
     }); 

     //if we have found a match from the second array, add the id from the second array to the corresponding item in the first array 
     if (found !== -1) { 
      arrayItem.push(array_two[found][1]); 
     } else { 
      //no match in the second array, so add id as null 
      arrayItem.push(null); 
     } 

     return arrayItem; 
     } 
    ); 

    //search the second array for items not in the first array 
    array_two.forEach(

    function(arrayItem) { 

     var found = -1; 

     //the search of the first array    
     result.forEach(function(resultItem, index) { 
     if (arrayItem[0] === resultItem[0]) { 
      found = index; 
     } 

     }); 

     //item wasn't in the first array, so we'll add it to our results, and add null as the first id (since it wasn't in the first array) 
     if (found === -1) { 
     arrayItem.splice(1, 0, null); 
     result.push(arrayItem); 
     } 
    } 
); 

    return result; 

}; 

のようにそれを使用しplunkerのコードです:https://plnkr.co/edit/Bwre9HMAL1pnebGnJTlp?p=preview

0

チェックこの機能:

mergeArrays = function(arr1, arr2) { 
    var result = []; 
    var array1 = JSON.parse(JSON.stringify(arr1)); 
    var array2 = JSON.parse(JSON.stringify(arr2)); 

    for (var ind1 = 0; ind1 < array1.length; ind1++) { 
     result.push(array1[ind1]); 
    } 

    var wasInSecond = false; 
    for (var ind1 = 0; ind1 < array1.length; ind1++) { 
     wasInSecond = false; 

     for (var ind2 = 0; ind2 < array2.length; ind2++) { 
      if (array1[ind1][0] == array2[ind2][0]) { 
       result[ind1].push(array2[ind2][1]); 
       wasInSecond = true; 
      } 
     } 
     if (!wasInSecond) { 
      result[ind1].push(null); 
     } 
    } 

    var wasInFirst = false; 
    for (var ind2 = 0; ind2 < array2.length; ind2++) { 
     wasInFirst = false; 
     for (var ind1 = 0; ind1 < array1.length; ind1++) { 
      if (array2[ind2][0] === array1[ind1][0]) { 
       wasInFirst = true; 
      } 
     } 
     if (!wasInFirst) { 
      var toAdd = [array2[ind2][0], null, array2[ind2][1]]; 
      result.push(toAdd); 
     } 
    } 

    return result; 
}; 

jsfiddleの作業を参照してください、付属のユニットテストで遊びます。

+0

[LODASH](https://lodash.com/docs)ライブラリを試しましたか?このような操作は、anglejsが提供しないいくつかの対話的な機能を提供するので、非常に簡単です。これはangularjsのアドオンです。この聖書を調べる時間を探してください。私はあなたが間違いなくそれを好きになると確信しています。 –

関連する問題