2015-06-30 5 views
20

Bei Eingabe:Array mit Objekten in 1 Objekt

[{ a: 1 }, { b: 2 }, { c: 3 }] 

Wie zurückzukehren:

{ a: 1, b: 2, c: 3 } 

Für Arrays it's not a problem mit lodash aber hier haben wir Array von Objekten.

+0

Ist es auch ok nach SO für npm-Pakete fragen? –

+0

Nein. Sie können das Problem beschreiben, das Sie gerade haben, wie Sie es gerade getan haben, und wenn die Antwort "installiere dieses npm-Paket" ist, dann ist das in Ordnung; aber Sie sollten nicht speziell nach einem Paket fragen, um das Problem zu lösen. – JJJ

Antwort

39

Verwendung Object.assign:

let merged = Object.assign(...arr); // ES6 (2015) syntax 

var merged = Object.assign.apply(Object, arr); // ES5 syntax 

Beachten Sie, dass Object.assign noch nicht in vielen Umgebung implementiert ist und man könnte es POLYfill müssen (entweder mit Core-js, eine andere polyfill oder mit dem polyfill auf MDN).

Sie erwähnten lodash, es ist so erwähnenswert, es zu diesem Zweck mit einer _.assign Funktion kommt, die das gleiche tut:

var merged = _.assign.apply(_, [{ a: 1 }, { b: 2 }, { c: 3 }]); 

Aber ich die neue Standard-Bibliothek Art und Weise wirklich empfehlen.

+3

Sehr schöne Lösung! – nils

+3

Sollten Sie nicht 'Object.assign ({}, ... arr)' ?! – Bergi

+0

@Bergi Ich kann, wenn ich den Eingang von 'assign' intakt erhalten möchte. Das muss ich natürlich nicht, wenn ich es nicht tue. Da dies keine Voraussetzung war, behandelte ich es nicht als solches. –

4

Hier ist eine Version ES6 Methoden nicht ...

var arr = [{ a: 1 }, { b: 2 }, { c: 3 }]; 
var obj = {}; 

for(var i = 0; i < arr.length; i++) { 
    var o = arr[i]; 
    for(var key in o) { 
     if(typeof o[key] != 'function'){ 
      obj[key] = o[key]; 
     } 
    } 
} 

console.log(obj); 

Geige mit: http://jsfiddle.net/yaw3wbb8/

+2

Beachten Sie, dass dies auch aufzählbare Prototypeigenschaften kopiert (was in diesem speziellen Fall kein Problem ist). –

+0

würde eine einfache '&&! O.propertyIsEnumerable (key)' hinzugefügt, um die if-Anweisung dies zu beheben? –

+0

Nun, für ... zählt nur aufzählbare Eigenschaften auf. Ein 'Object (o) .hasOwnProperty (obj)' würde es zwar reparieren (sicherstellen, dass es sich nicht um den Prototyp handelt) - der 'Object (o)' Teil soll sicherstellen, dass wir zum Beispiel keine nicht existierende Methode aufrufen Passing '4' würde nicht fehlschlagen (und nichts kopieren). –

3

können Sie Funktion wie die Verwendung underscore.extend:

var _ = require('underscore'); 
var a = [{ a: 1 }, { b: 2 }, { c: 3 }]; 

var result = _.extend.apply(null, a); 
console.log(result); // { a: 1, b: 2, c: 3 } 
console.log(a); // [ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ] 

Und Um das Ändern des ursprünglichen Arrays zu verhindern, sollten Sie

verwenden
var _ = require('underscore'); 
var a = [{ a: 1 }, { b: 2 }, { c: 3 }]; 

var result = _.extend.apply(null, [{}].concat(a)); 
console.log(result); // { a: 1, b: 2, c: 3 } 
console.log(a); // [ { a: 1 }, { b: 2 }, { c: 3 } ] 

Here can test it

1

Ich habe eine nette kleine Lösung bekam keine polyfill erfordern.

var arr = [{ a: 1 }, { b: 2 }, { c: 3 }]; 
var object = {}; 

arr.map(function(obj){ 
    var prop = Object.getOwnPropertyNames(obj); 
    object[prop] = obj[prop]; 
}); 

Hope that :)

+2

Ich habe keine Ahnung, warum das upvoted wurde, da es nicht funktioniert - getOwnPropertyNames gibt ein Array zurück. –

+0

@BenjaminGruenbaum Für diesen Anwendungsfall funktioniert es perfekt. Siehe meine Geige: http://jsfiddle.net/dhgsbg99/ –

+1

Dies ist nur nebensächlich, da alle Objekte eine einzige Eigenschaft haben und 'toString' das Array mit einer einzigen Eigenschaft gibt das gleiche Ergebnis, versuchen Sie eine Eigenschaft zu einer der hinzufügen die Objekte und sehe es scheitern: http://jsfiddle.net/zqvhceyj/ –

4

Mit lodash hilft, können Sie merge():

var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ]; 
_.merge.apply(null, [{}].concat(arr)); 
// → { a: 1, b: 2, c: 3 } 

Wenn Sie dies an mehreren Stellen tun, können Sie merge() ein wenig mehr elegant durch machen mit partial() und :

var merge = _.spread(_.partial(_.merge, {})); 
merge(arr); 
// → { a: 1, b: 2, c: 3 } 
Verwandte Themen