javascript - recorrer - object.assign array
Seguramente ES6+debe tener una forma de fusionar dos objetos javascript juntos, ¿qué es? (6)
Estoy cansado de cansarme de tener que escribir siempre código como este:
function shallowExtend(obj1,obj2){
var key;
for ( key in obj2 ) {
if ( obj2.hasOwnProperty(key) === false ) continue;
obj1[key] = obj2[key]
}
}
O si no quiero escribir el código yo mismo, implemente una biblioteca que ya lo haga. Seguramente ES6 + viene al rescate en esto nos proporcionará algo así como Object.prototype.extend(obj2...)
u Object.extend(obj1,obj2...)
Entonces, ¿ES6 + proporciona esa funcionalidad? Si no está ya allí, ¿está planeada dicha funcionalidad? Si no se planifica, ¿por qué no?
ES6
Object.assign(o1,o2) ;
Object.assign({},o1,o2) ; //safe inheritance
var copy=Object.assign({},o1); // clone o1
//------Transform array of objects to one object---
var subjects_assess=[{maths:92},{phy:75},{sport:99}];
Object.assign(...subjects_assess); // {maths:92,phy:75,sport:99}
ES7 o Babel
{...o1,...o2} // inheritance
var copy= {...o1};
La adición de Object.mixin
se está discutiendo actualmente para cuidar el comportamiento que está solicitando. https://mail.mozilla.org/pipermail/es-discuss/2012-December/027037.html
Aunque aún no figura en el borrador de ES6, parece que hay mucho apoyo para él, así que creo que aparecerá pronto en los borradores.
Podrás hacer una fusión superficial / extender / asignar en ES6 usando Object.assign:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Sintaxis:
Object.assign ( target , ... fuentes );
donde ... las fuentes representan los objetos fuente.
Nota: no confunda ... fuentes en la definición de sintaxis con un operador de dispersión ES6.
Ejemplo:
var obj1 = {name: ''Daisy'', age: 30};
var obj2 = {name: ''Casey''};
Object.assign(obj1, obj2);
console.log(obj1.name === ''Casey'' && obj1.age === 30);
// true
Puede usar el objeto reposo / dispersión para esto:
const merged = {...obj1, ...obj2}
La proposal ECMAScript se encuentra actualmente en la etapa 3 y habilitada en Babel mediante el uso del escenario preestablecido de la etapa 3 .
Sé que esto es un problema viejo pero la solución más fácil en ES2015 / ES6 es bastante simple, usando Object.assign (),
Espero que esto ayude, esto hace que DEEP se fusione también:
/**
* Simple is object check.
* @param item
* @returns {boolean}
*/
export function isObject(item) {
return (item && typeof item === ''object'' && !Array.isArray(item) && item !== null);
}
/**
* Deep merge two objects.
* @param target
* @param source
*/
export function mergeDeep(target, source) {
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return target;
}
Ejemplo de uso:
mergeDeep(this, { a: { b: { c: 123 } } });
// or
const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}});
console.dir(merged); // { a: 1, b: { c: { d: [Object] } } }
Tal vez el método ES5 Object.defineProperties
hará el trabajo?
p.ej
var a = {name:''fred''};
var b = {age: {value: 37, writeable: true}};
Object.defineProperties(a, b);
alert(a.age); // 37
Documentación de MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties