2016-03-25 77 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; 
 
    } 
 
}