2016-03-25 14 views
0

Ich habe mehrere Javascript-Objekte, die ich rekursiv zusammenführen möchte. Die Objekte haben einige Zahleneigenschaften, die ich beim Zusammenführen addiere. Die Objekte haben auch einige Map Eigenschaften. Hier ist beispielsweise, wie mein Objekt in Entwicklerkonsole aussieht:Objekte zusammenführen, die verschachtelte Map-Objekte enthalten

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

ich die Werte dieser Karte zusammenführen möchten Objekte, so dass alle Zahlen von passenden Tasten werden addiert.

Ich verwende _.mergeWith und seine Customizer-Funktion. Ich kann die einfachen Zahleneigenschaften erfolgreich zusammenführen, aber wie füge ich auch die Map-Objekte zusammen? Gerade jetzt ersetzt meine Customizer-Merger-Funktion nur das Map-Objekt, so dass das letzte gewinnt. Hier ist meine Customizer Funktion mit Ich verwende _.mergeWith

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

Es ist schwierig, Antworten zu finden, bei der Suche, weil „Karte“ Stichwort nur Bündel von .map zieht() Ergebnisse, anstelle des Kartenobjekts.

+0

Ich habe ein jsFiddle https://jsfiddle.net/assvfk2b/5/ für das, was erklärt Ihnen, aber ich bin nicht sicher, was Sie durch die Zusammenlegung der Karte Objekt bedeuten können Sie bitte bearbeiten Sag mir, was genau du brauchst. – Rahul

+0

Ich habe die Geige aktualisiert, um die tatsächliche Datenstruktur anzuzeigen, mit der ich arbeite. Es nutzt das Map-Objekt in Javascript. – Rastographics

Antwort

0

Ich kam mit einer Merger-Funktion, die funktioniert. Nicht so elegant, wie ich es mir erhofft hatte, aber hier zu posten, für den Fall, dass noch jemand daran festhält.

Der einzige Nachteil ist, dass es nicht so allgemeine Lösung ist, wie ich möchte. Ich denke, es würde Änderungen erfordern, um mit verschiedenen Arten von Strukturen und Rekursionskomplexität gut zu arbeiten.

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; 
 
    } 
 
}

Verwandte Themen