JavaScript объединить 2 объекта

Рейтинг: 0Ответов: 2Опубликовано: 19.04.2023

Можно ли как-то смержить 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)}
};

Ответы

▲ 0

надо вызвать обе функции

Тогда можно предложить вот такой вариант решения...

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
    }

Но все это сделано только в рамках приведенных ТСом объектов. Не более того.

▲ 0

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']();