2014-12-18 4 views
6

Ich habe ein Array von Objekten wie folgt aus:Wie kann ich Array von Objekten mit js Strich verschmelzen

array1 = [ 
    {field: 'username', display: 'username', hide: true}, 
    {field: 'age', display: 'Age', hide: true}, 
    {field: 'height', display: 'Height', hide: true} 
] 

Dann habe ich array2:

array2 = [ 
    {field: 'username', display: 'username 123', hide: false}, 
    {field: 'age', hide: false} 
] 

ich durch diese beiden Arrays zusammenführen möchten ihre Feld dh das Endergebnis sollte sein:

array3 = [ 
    {field: 'username', display: 'username 123', hide: false}, 
    {field: 'age', display: 'Age', hide: false}, 
    {field: 'height', display: 'Height', hide: true} 
] 

ich versuchte var newObj = _.extend(array1, array2); aber es hat mir nicht, was ich will.

+0

Sie suchen nach concat. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat – Brian

+0

@Brian: Nein, er macht eine Art Aktualisierung. –

+0

@Karoly Horvath Ah ja, er möchte die Objekte zusammenfassen und das Array – Brian

Antwort

10

Es gibt keine Funktion, die es tun wird, da es eine ziemlich spezialisierte Operation ist. Doch es ist eine ziemlich einfache Zusammensetzung von Unterstrichen Funktionen:

_.values(_.extend(_.indexBy(array1, 'field'), _.indexBy(array2, 'field'))) 

Wir verwenden indexBy die Arrays in Objekte auf dem field eingegebene Wert zu drehen, und dann extend tut, was wir wollen. Schließlich verwandelt values es wieder in ein Array.

Beachten Sie, dass während dieser keine Garantien über die Bestellung macht, in den aktuellen _ und v8 Implementierungen die endgültige Anordnung von array1 die Dinge, durch die Dinge, von array2 gefolgt sein wird, die in der nicht in array1, sortiert sind ursprüngliche Reihenfolge jedes Arrays.

Beachten Sie auch, dass die Funktion _.extend für das erste Argument destruktiv ist, während dies keines der Arrays ändert.

Wenn Sie wollen sicher sein, dass die Reihenfolge der gleiche wie der ursprüngliche array1 ist:

order = _.object(_.map(array1, function(obj, i) { return [obj.field, i]; })) 
_.sortBy(_.values(_.extend(_.indexBy(array1, 'field'), _.indexBy(array2, 'field'))), function(obj) { order[obj.field]; }) 

Hier haben wir eine Lookup-Tabelle von Positionen zu machen und dann die ursprüngliche Lösung auf der Lookup-Tabelle basiert sortieren.

+0

danke, das war was ich will. Wie kann ich die Bestellung bewahren? ich meine, ich möchte, dass die Reihenfolge wie im ersten Array bleibt. Das zweite Array enthält keine neuen Elemente. Es ist nur für die Aktualisierung – user3214546

+0

Eine absolut ausgezeichnete Antwort! –

+0

Ich habe 2 Liste eins ist: '[{" image_id ": 631293," score ": 73}, {" image_id ": 11848407," score ": 56}]' zweite ist '[{" image_id " : 631293, "article_id": 173}, {"image_id": 11848407, "article_id": 121} ' Wenn ich versuche, Ihre Methode anzuwenden, ändert es nichts – Toucouleur

Verwandte Themen