Блог → Javascript: объединение двух JSON объектов

Сегодня решил размяться и написать функцию для объединения двух JSON объектов:


function json_merge_recursive(json1, json2){
	var out = {};
	for(var k1 in json1){
		if (json1.hasOwnProperty(k1)) out[k1] = json1[k1];
	}
	for(var k2 in json2){
		if (json2.hasOwnProperty(k2)) {
			if(!out.hasOwnProperty(k2)) out[k2] = json2[k2];
			else if(
				(typeof out[k2] === 'object') && (out[k2].constructor === Object) && 
				(typeof json2[k2] === 'object') && (json2[k2].constructor === Object)
			) out[k2] = json_merge_recursive(out[k2], json2[k2]);
		}
	}
	return out;
}

Это рекурсивная функция. В качестве параметров она принимает два JSON объекта, и дополняет первый из них вторым. Если ключ присутствует в обоих объектах, а значения в свою очередь являются JSON объектами, то объединение продолжается дальше, рекурсивно. Более наглядно это видно на примере:


var json1 = {
	key1: 'val1',
	key3: {
		key3_1: 'val3_1',
		key3_2: 'val3_2',
		key3_3: {
			key3_3_1: 'val3_3_1',
			key3_3_2: 'val3_3_2',
		}
	},
	key4: {
		key4_1: 'val4_1'
	}
}

var json2 = {
	key1: 'val1D',
	key2: 'val2D',
	key3: {
		key3_1: 'val3_1D',
		key3_7: 'val3_7D',
		key3_3: {
			key3_3_1: 'val3_3_1D',
			key3_3_8: 'val3_3_8D',
		},
		key3_4: {
			key3_4_1: 'val3_4_1D',
			key3_4_2: 'val3_4_1D',
		}
	},
	key4: ['valD']
}

var json = json_merge_recursive(json1, json2);

/*результат {
	key1: 'val1',
	key2: 'val2D',
	key3: {
		key3_1: 'val3_1',
		key3_2: 'val3_2',
		key3_3: {
			key3_3_1: 'val3_3_1',
			key3_3_2: 'val3_3_2',
			key3_3_8: 'val3_3_8D'
		},
		key3_4: {
			key3_4_1: 'val3_4_1D',
			key3_4_2: 'val3_4_2D'
		},
		key3_7: 'val3_7D' 
	},
	key4: {
		key4_1: 'val4_1'
	}
}*/

Демка на jsFiddle


Комментарии (7)

amt779
спасибо
Ответить
K0rINf
Красавчик! пригодилось
Ответить
павел
Отличная функция, спасибо
Ответить
Александр
Облазил весь интернет. Писать самому было влом. Нашел кучу примеров на 100 и более строк кода. Но они где-то не работали или тупили. Этот же пример идеален. Красавчик тот, кто его написал. Респекты и уважуха!!!
Ответить
jhon
Все проще, $.extend(obj1,obj2)
Ответить
Savvateev
Может быть и проще, только здесь реализация на чистом javascript без jQuery.
Ответить
igor
круто, спасибо
Ответить


Оставить свой комментарий


Представтесь, пожалуйста *

Ваш комментарий

Число на картинке *

captcha

На хостинг