JavaScript объединить 2 объекта
Можно ли как-то смержить 2 объекта таким образом, чтобы функции не перезаписывались? Из:
a1 = {
a: "50",
b: "51",
c: () => {console.log(1)},
d: () => {console.log(2)},
e: () => {console.log(3)}
};
a2 = {
a: "5",
b: "6",
c: () => {console.log(11)},
d: () => {console.log(22)}
};
Получить:
a3 = {
a: "5",
b: "6",
c: () => {console.log(1), console.log(11)},
d: () => {console.log(2), console.log(22)},
e: () => {console.log(3)}
};
Ответы (2 шт):
Автор решения: ksa
→ Ссылка
надо вызвать обе функции
Тогда можно предложить вот такой вариант решения...
const a1 = {
a: "50",
b: "51",
c: () => {console.log(1)},
d: () => {console.log(2)},
e: () => {console.log(3)}
};
const a2 = {
a: "5",
b: "6",
c: () => {console.log(11)},
d: () => {console.log(22)}
};
const a3 = merge(a1, a2)
console.log(a3.a)
console.log(a3.b)
a3.c()
a3.d()
a3.e()
//
function merge(a1, a2) {
const o = Object.keys(a2).reduce((o, k) => {
if (typeof a2[k] == 'function') {
if (a1[k]) {
o[k] = _ => (a1[k](), a2[k]())
} else {
o[k] = a2[k]
}
} else {
o[k] = a2[k]
}
return o
}, {})
Object.keys(a1).reduce((o, k) => a2[k] ? o : o[k] = a1[k], o, o)
return o
}
Или еще вот таким образом можно "объединить тела" двух таких методов...
const a1 = {
a: "50",
b: "51",
c: () => {console.log(1)},
d: () => {console.log(2)},
e: () => {console.log(3)}
};
const a2 = {
a: "5",
b: "6",
c: () => {console.log(11)},
d: () => {console.log(22)}
};
const a3 = merge(a1, a2)
//console.log(a3)
console.log(a3.a)
console.log(a3.b)
a3.c()
a3.d()
a3.e()
//
function merge(a1, a2) {
const re = /^[^{]+\{|\}$/g
const o = Object.keys(a2).reduce((o, k) => {
if (typeof a2[k] == 'function') {
const a = []
if (a1[k]) a.push(a1[k].toString().replace(re, ''))
a.push(a2[k].toString().replace(re, ''))
o[k] = new Function(a.join(', '))
} else {
o[k] = a2[k]
}
return o
}, {})
Object.keys(a1).reduce((o, k) => a2[k] ? o : (
o[k] = new Function(a1[k].toString().replace(re, '')), o
), o)
return o
}
Но все это сделано только в рамках приведенных ТСом объектов. Не более того.
Автор решения: Stanislav Volodarskiy
→ Ссылка
const merge = (a, b) => {
const c = {};
// copy/merge keys from b
for (const [k, vb] of Object.entries(b)) {
// if a has k
if (Object.prototype.hasOwnProperty.call(a, k)) {
const va = a[k];
if (vb instanceof Function && va instanceof Function) {
c[k] = () => { va(); vb(); };
} else {
c[k] = vb;
}
} else {
c[k] = vb;
}
}
// copy missing keys from a
for (const [k, va] of Object.entries(a)) {
// if c has no k
if (!Object.prototype.hasOwnProperty.call(c, k)) {
c[k] = va;
}
}
return c;
};
a1 = {
a: "50",
b: "51",
c: () => {console.log(1)},
d: () => {console.log(2)},
e: () => {console.log(3)}
};
a2 = {
a: "5",
b: "6",
c: () => {console.log(11)},
d: () => {console.log(22)}
};
console.log(merge(a1, a2));
merge(a1, a2)['c']();
merge(a1, a2)['d']();
merge(a1, a2)['e']();