Как произвести слияние двух многомерных объектов без полной замены вложенных?

Добрый вечер. Есть, к примеру, 2 массива:
var object1 = {
	lang: {
		loading: "Loading...",
		months: "January February March April May June July August September October November December".split( " " ),
		shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split( " " ),
	},
}

var object2 = {
	lang: {
		loading: "...",
	},
}

Как произвести слияние так, чтобы на выходе получилось:
{
	lang: {
		loading: "...",
		months: "January February March April May June July August September October November December".split( " " ),
		shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split( " " ),
	},
}

То есть заменился только ключ lang.loading, а не переписался весь объект lang
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
@maksam07 Автор вопроса
Все таки получилось найти более простое решение
С переписыванием первого объекта: https://stackoverflow.com/a/34749873/2166371
Без перезаписи: https://stackoverflow.com/a/37164538/2166371
По первому варианту можно первым аргументов задать пустой объект и перезаписи не будет:
var obj3 = mergeDeep( {}, defObj, newObj2 );
По второму варианту просто первый аргумент убирается.
В первом варианте в первое условие в цикле добавил еще
source.hasOwnProperty( key )
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
locky_yotun
@locky_yotun Куратор тега JavaScript
Я видел некоторый джаваскрипт
https://www.npmjs.com/package/deepmerge
Ссылка на исходник на GitHub там тоже есть
Ответ написан
@usheninmike
Если нужно простое решение для этого простого случая, то перебирайте реурсивно ключи второго объекта циклом for...in, в нём проверяйте, есть ли текущий ключ в первом объекте, и в случае успеха переписывайте его значение из второго объекта.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы