2016-09-01 6 views
2

ich zwei Arrays von Objekten:Wie zwei Wörterbücher in Javascript fusionieren

Array1:

var myArr1 = []; 
myArr1["1"]={any:1,some:1}; 
myArr1["2"]={any:2,some:2}; 
myArr1["3"]={any:3,some:3}; 

Array2:

var myArr2 = []; 
myArr2["1"]={other:1};  
myArr2["2"]={other:2}; 

Und ich sie wollen durch ihre Schlüssel verschmolzen werden in ein neues Attribut, so wird das Ergebnis sein:

[ 
    {any:1,some:1,myNewAttribute:{other:1}}, 
    {any:2,some:2,myNewAttribute:{other:2}}, 
    {any:3,some:3,myNewAttribute:{other:3}} 
] 

Ich versuchte es mit lodash _.merge() zu erreichen, aber ich scheiterte kläglich. _.merge fügt nur das zweite Array nach dem ersten hinzu, stimmt aber nicht mit ihren Schlüsseln/IDs überein.

+1

Ist der Pseudo-Code? Javascript hat Objekte, nicht dicts. Was genau hat mit '_.merge' nicht funktioniert? –

+1

Betrachtet man das gewünschte Ergebnis, hat das erste Element eine 'some' Eigenschaft, aber nicht die zweite oder dritte? Ist das wirklich was du willst, oder willst du die 'some' Eigenschaft auf allen Elementen im Ergebnis haben? –

+0

Ich habe die Frage bearbeitet. Ich weiß, wie man sie manuell mit einer 'for'-Schleife kombiniert, aber ich wollte es mit lodash elegant halten. –

Antwort

3

Sie könnten das zweite Array einer neuen Eigenschaft zuordnen und später zusammenführen.

Mit lodash

var data1 = [{ any: 1, some: 1 }, { any: 2, some: 2 }, { any: 3, some: 3 }], 
 
    data2 = [{ other: 1 }, { other: 2 }, { other: 3 }]; 
 

 
console.log(_.merge(data1, _.map(data2, x => ({ myNewAttribute: x }))));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

Mit ES6, ohne lodash

var data1 = [{ any: 1, some: 1 }, { any: 2, some: 2 }, { any: 3, some: 3 }], 
 
    data2 = [{ other: 1 }, { other: 2 }, { other: 3 }]; 
 

 
console.log(data1.map((a, i) => Object.assign({}, a, { myNewAttribute: data2[i] })));

0

Sie mögen dies tun können:

var first = [{any:1,some:1},{any:2,some:2},{any:3,some:3}]; 
var second = [{other:1},{other:2},{other:3}]; 

for(var i = 0; i < first.length; i++){ 
    if(first[i] && second[i]){ 
     first[i]['mycustomitem'] = second[i]; 
    } 
} 

console.log(first); 
1

Sie brauchen nicht lodash:

myArr1.map((e1, idx) => Object.assign({}, e1, {myNewAttribute: myArr2[idx]})) 

Sie Lust bekommen und schreiben konnte eine kleine Funktion map2 genannt, die zwei Arrays nimmt und ruft einen Rückruf mit den zwei Elementen:

function map2(a1, a2, fn) { 
    return a1.map((elt, idx) => fn(elt, a2[idx]); 
} 

Jetzt können Sie die Lösung als

map2(myArr1, myArr2, (e1, e2) => Object.assign({}, e1, {myNewAttribute: e2})) 
schreiben

Aus der Perspektive des Programmdesigns, was wir hier tun, ist "trennen Anliegen". Die erste Sorge ist die abstrakte Operation der Schleife über zwei Arrays parallel und macht etwas mit jedem Paar von Elementen. Das ist, was durch map2 dargestellt wird. Die zweite Sorge ist die spezifische Art, wie Sie die Elemente kombinieren möchten. Das entspricht der Funktion, die wir an map2 übergeben. Dies könnte klarer und etwas selbsterklärend gemacht werden, indem sie separat zu schreiben:

function combineObjects(e1, e2) { 
    return Object.assign({}, e1, {myNewAttribute: e2}); 
} 

map2(myArr1, myArr2, combineObjects); 

Natürlich in der realen Welt, würden Sie den Fall behandeln wollen, wo die beiden Arrays unterschiedlicher Länge waren, einen Index übergeben für den Rückruf als dritten Parameter für die Verwendung, falls erforderlich, unterstützen einen dritten thisArg-Typ Parameter analog zu map, etc.

-1

Versuchen Sie, diese Funktion:

function mergeDictionary(_dctn1,_dctn2) 
 
{ 
 
    var newDict = []; 
 
    for(var i in _dctn1) 
 
    { 
 
     newDict[i] = _dctn1[i]; 
 
    } 
 
    for(var j in _dctn2) 
 
    { 
 
     if(newDict[j] == undefined) 
 
     { 
 
      newDict[j] = _dctn2[j]; 
 
     } 
 
     else 
 
     { 
 
      for(var k in _dctn2[j]) 
 
      { 
 
       newDict[j][k] = _dctn2[j][k]; 
 
      } 
 
     } 
 
    
 
    } 
 
    
 
    return newDict; 
 
} 
 

 

 
var myArr1 = []; 
 
myArr1["1"]={any:1,some:1}; 
 
myArr1["2"]={any:2,some:2}; 
 
myArr1["3"]={any:3,some:3}; 
 

 
var myArr2 = []; 
 
myArr2["1"]={other:1};  
 
myArr2["2"]={other:2}; 
 

 
console.log(mergeDictionary(myArr1, myArr2));

+0

Warum verwenden Sie den Begriff "Wörterbuch", wenn JS nicht einmal Wörterbücher hat? Die fraglichen Objekte sind Arrays. Warum würden Sie eine Schleife schreiben, um ein Array zu kopieren, wenn Sie 'newDict = _dctn1.slice();'? –

+1

Ich hoffe, es macht Ihnen nichts aus, aber ich habe Ihren Code zu einem ausführbaren Snippet gemacht. Wenn Sie es ausführen, werden Sie feststellen, dass es nicht so aussieht, wie die Frage verlangt. – JJJ

+0

Eigentlich sollte es Objekt statt Array sein – spankajd

0

Um zu beweisen, was ich getan habe Kommentar vor 30 Minuten - How to merge two dictionaries in javascript - gibt es einen möglichen reduce Ansatz ...

... zuerst als lodash basierend Beispiel ...

var 
 
    myArr1 = [ 
 
     {any: 1, some: 1}, 
 
     {any: 2, some: 2}, 
 
     {any: 3, some: 3} 
 
    ], 
 
    myArr2 = [ 
 
     {other: 1}, 
 
     {other: 2} 
 
    ], 
 

 
    mergedObjectList = _.reduce(myArr1, function (collector, item_1, idx) { 
 
     var 
 
      item_2 = collector[idx], 
 
      merger = _.assign({}, item_1, item_2); 
 

 
     // or whatever one wants to do to `merger` with `myNewAttribute` 
 

 
     collector[idx] = merger; 
 

 
     return collector; 
 

 
    }, _.clone(myArr2)); 
 

 

 
console.log("myArr1 : ", myArr1); 
 
console.log("myArr2 : ", myArr2); 
 
console.log("mergedObjectList : ", mergedObjectList);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

... und zweitens als Sprachkern nur basierend Beispiel ...

var 
 
    myArr1 = [ 
 
     {any: 1, some: 1}, 
 
     {any: 2, some: 2}, 
 
     {any: 3, some: 3} 
 
    ], 
 
    myArr2 = [ 
 
     {other: 1}, 
 
     {other: 2} 
 
    ], 
 

 
    mergedObjectList = myArr1.reduce(function (collector, item_1, idx) { 
 
     var 
 
      item_2 = collector[idx], 
 
      merger = Object.assign({}, item_1, item_2); 
 

 
     // or whatever one wants to do to `merger` with `myNewAttribute` 
 

 
     collector[idx] = merger; 
 

 
     return collector; 
 

 
    }, Array.from(myArr2)); 
 

 

 
console.log("myArr1 : ", myArr1); 
 
console.log("myArr2 : ", myArr2); 
 
console.log("mergedObjectList : ", mergedObjectList);

+0

Gibt es einen Grund, warum Sie die Code-Tags einrücken? –

+1

@NinaScholz - danke für den Hinweis, es ist versehentlich passiert und wurde inzwischen behoben. –

Verwandte Themen