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.
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.
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.
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/
Beachten Sie, dass dies auch aufzählbare Prototypeigenschaften kopiert (was in diesem speziellen Fall kein Problem ist). –
würde eine einfache '&&! O.propertyIsEnumerable (key)' hinzugefügt, um die if-Anweisung dies zu beheben? –
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). –
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
verwendenvar _ = 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 } ]
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 :)
Ich habe keine Ahnung, warum das upvoted wurde, da es nicht funktioniert - getOwnPropertyNames gibt ein Array zurück. –
@BenjaminGruenbaum Für diesen Anwendungsfall funktioniert es perfekt. Siehe meine Geige: http://jsfiddle.net/dhgsbg99/ –
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/ –
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 }
Ist es auch ok nach SO für npm-Pakete fragen? –
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