2016-03-25 79 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

我想合併這些地圖的值對象,因此匹配關鍵字的所有數字相加。

我正在使用_.mergeWith及其定製器功能。我可以成功地合併簡單數字屬性,但我如何合併Map對象呢?現在我的定製器合併函數正在替換Map對象,因此最後一個獲勝。 這裏是我使用的是_.mergeWith

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

這是很難找到答案,因爲搜索的「地圖」關鍵字剛拉起一串.MAP()的結果時,我的定製功能,而不是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; 
 
    } 
 
}