2016-03-25 10 views
0

私は再帰的に一緒にマージする複数のjavascriptオブジェクトを持っています。 オブジェクトには、マージ時に一緒に追加するいくつかの番号プロパティがあります。 オブジェクトにはまた、いくつかのMapプロパティがあります。ここに私のオブジェクトは、デベロッパーコンソールでどのように見えるかの例です:入れ子になったマップオブジェクトを含むオブジェクトをマージする

byGender:Map 
 
    0:{"Male" => 9} 
 
     key:"Male" 
 
     value:9 
 
    1:{"Female" => 11} 
 
     key:"Female" 
 
     value:11 
 
byType:Map 
 
    0:{"Teens" => Object} 
 
     key:"Teens" 
 
     value:Object 
 
      byGender:Map 
 
       0:{"Guys" => 7} 
 
        key:"Guys" 
 
        value:7 
 
       1:{"Girls" => 10} 
 
        key:"Girls" 
 
        value:10 
 
      total:17 
 
    1:{"Chaperones" => Object} 
 
     key:"Chaperones" 
 
     value:Object 
 
      byGender:Map 
 
       0:{"Ladies" => 1} 
 
        key:"Ladies" 
 
        value:1 
 
       1:{"Men" => 2} 
 
        key:"Men" 
 
        value:2 
 
      total:3 
 
total:42

私は一致するキーのすべての数字が一緒に追加されたこれらのMapオブジェクトの値をマージしたいです。

私は_.mergeWithとそのカスタマイザ機能を使用しています。私は首尾よく単純な番号のプロパティをマージすることができますが、私はどのようにマップオブジェクトをマージするのですか?現在、私のカスタマイザの合併機能は、最後のものが勝つようにマップオブジェクトを置き換えるだけです。 はここで、「マップ」のキーワードだけで()の結果.MAPの束を引き上げるために検索するときに、私は答えを見つけるためにそれは難しい_.mergeWith

var merger = function (a, b) { 
 
    if (_.isNumber(a)) { 
 
     return a + b; 
 
    } else { 
 
     return _.mergeWith(a, b, merger); 
 
    } 
 
    };

を使用しています私のカスタマイザー機能ですMapオブジェクトの代わりに使用します。

+0

私はあなたが説明したもののためにjsFiddle https://jsfiddle.net/assvfk2b/5/を作成し、私はあなたが編集してくださいすることができますが、マップのオブジェクトをマージすることにより、何を意味するかわかりませんjsFiddleとあなたに必要なものを教えてください。 – Rahul

+0

私は実際のデータ構造を表示するためにフィドルを更新しました。これは、javascriptでMapオブジェクトを使用します。 – Rastographics

答えて

0

私は、動作する合併関数を考え出しました。他に誰かがこのことに悩まされている場合に備えて、私が望むだけでエレガントではなく、ここに投稿してください。

唯一の欠点は、私が望むような一般的な解決策ではないことです。さまざまな種類の構造や再帰の複雑さに対応するためには変更が必要になると思います。

function merger(source, mergeTarget) { 
 
    if (_.isNumber(source)) { 
 
     return source + mergeTarget; 
 
    } 
 
    else if (_.isMap(source)) { 
 
     var newMap = new Map(); 
 
     source.forEach(function(value,key,root){ 
 
      var newValue = mergeTarget.get(key); 
 
      if(_.isNumber(value)) 
 
       newMap.set(key,value + newValue); 
 
      else if (_.isObject(value)){ 
 
       var newObj = {}; 
 
       _.mergeWith(newObj,value,newValue,merger); 
 
       newMap.set(key,newObj); 
 
      } 
 
     }); 
 
     return newMap; 
 
    } 
 
}

関連する問題