@liltrill

Как во вложенном объекте заменить значения?

Что есть:

a = {
     a: 'hello',
     b: 'hello',
     c: {
          ca: 'hello',
          cb: 'hello',
          cc: 'Нужно сохранить'
     }
};

b = {
     a: 'new value',
     b: 'new value',
     c: {
          ca: 'new value',
          cb: 'new value',
     }
};


Что нужно получить:

c = {
     a: 'new value',
     b: 'new value',
     c: {
          ca: 'new value',
          cb: 'new value',
          cc: 'Нужно сохранить'
     }
};


P.S: Делаю вот так, нет ли лучшего решения?

for (let key in b) {

                    /* Глубокое обновление кроме потомков */
                    if (key === 'c') {
                        for (let i = 0; i < b[key].length; i++) {
                            for (let key2 in b[key][i]) {
                                a[key][i][key2] = b[key][i][key2];
                            }
                        }
                        continue;
                    }
                    /**/

                    a[key] = b[key];
                }
  • Вопрос задан
  • 102 просмотра
Решения вопроса 3
@dimoff66
Кратко о себе: Я есть
Универсальный merge без привязки к конкретному имени реквизита с возможностью задания глубины посвойственного обновления

const deepMerge = (a, b, howDeep = 1000) => {
   a = {...a}
   Object.entries(b).forEach(([key, value]) => {
      if (typeof value !== 'object' || howDeep < 1) {
         a[key] = value    
      } else {
         a[key] = deepMerge(a[key], value, howDeep - 1)
      }
   })
   
   return a;
} 

const c = deepMerge(a, b)
console.log(c)
Ответ написан
@vadimMalovaniy
a.c = { ...a.c, ...b.c }
Ответ написан
Комментировать
@liltrill Автор вопроса
Реализация решений Дмитрий на for of и с автоматическим поиском вложенности:

deepMerge(a, b) {
    a = {...a};

    for (let [key, value] of Object.entries(b)) {
        if (typeof value !== 'object') a[key] = value;
        else a[key] = this.deepMerge(a[key], value);
    }

    return a;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы