elementos - lista de objetos javascript
Aplanar la matriz con objetos en 1 objeto (6)
Aquí hay una versión que no usa métodos ES6 ...
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);
Fiddle: http://jsfiddle.net/yaw3wbb8/
Entrada dada:
[{ a: 1 }, { b: 2 }, { c: 3 }]
Cómo volver:
{ a: 1, b: 2, c: 3 }
Para matrices no es un problema con lodash pero aquí tenemos una matriz de objetos.
Con lodash, puedes usar merge() :
var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ];
_.merge.apply(null, [{}].concat(arr));
// → { a: 1, b: 2, c: 3 }
Si está haciendo esto en varios lugares, puede hacer que merge()
un poco más elegante usando partial() y spread() :
var merge = _.spread(_.partial(_.merge, {}));
merge(arr);
// → { a: 1, b: 2, c: 3 }
Este es un buen uso de Object.assign
con la función array.prototype.reduce
:
let merged = arrOfObjs.reduce((accum, val) => {
Object.assign(accum, val);
return accum;
}, {})
Este enfoque no muta la matriz de entrada de objetos, lo que podría ayudarlo a evitar problemas difíciles de solucionar.
Puedes usar la función de subrayado.extender así:
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 } ]
Y para evitar modificar la matriz original debes usar
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 } ]
Tengo una pequeña solución que no requiere un polyfill.
var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var object = {};
arr.map(function(obj){
var prop = Object.getOwnPropertyNames(obj);
object[prop] = obj[prop];
});
Espero que ayude :)
Utilice Object.assign
:
let merged = Object.assign(...arr); // ES6 (2015) syntax
var merged = Object.assign.apply(Object, arr); // ES5 syntax
Tenga en cuenta que Object.assign
aún no está implementado en muchos entornos y es posible que necesite realizar un Object.assign
múltiple (ya sea con core-js, otro polyfill o usar polyfill en MDN).
Usted mencionó lodash, por lo que vale la pena señalar que viene con una función _.assign
para este propósito que hace lo mismo:
var merged = _.assign.apply(_, [{ a: 1 }, { b: 2 }, { c: 3 }]);
Pero realmente recomiendo la nueva forma de biblioteca estándar.