@fatedupi

Как сделать правильный deep extend двух объектов у которых в свойствах очень глубокие объекты типа $('.some')?

Всем привет, у меня есть 2 объекта, которые нужно соединить в один.
Причем так что-бы они дополнили друг-друга.
Примерно так:
var a = {
	bar: 'hello world',
	foo: {
		a: 1,
		b: 2,
	}
}

var b = {
	foo: {
		c: 3
	},
    /*jqueryprop: $('#btn')*///Вот тут проблема 
}
deepExtend(a, b);
console.log(a)
/*Object:
	bar: "hello world"
	foo: Object
		a:1
		b:2
		c:3
*/


Для этого я нашел функцию, которую можно глянуть в примере на https://jsfiddle.net/daggkeu1/2/
Все вроде работает, пока среди свойств не встречается какой-нибудь объект типа такого: $('#btn')
Он получается охренительно большой в глубину и я получаю Maximum call stack size exceeded
Пока наблюдаю такое поведение только у jquery объектов, но хотелось-бы понять как все-таки подобное можно отследить и правильно скопировать?

Спасибо!
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
@fatedupi Автор вопроса
deepExtend = function() {
	var options, name, src, copy, copyIsArray, clone,
			target = arguments[0] || {},
			i = 1,
			length = arguments.length,
			deep = true;

	for ( ; i < length; i++ ) {

		if ( (options = arguments[ i ]) != null ) {
			
			for ( name in options ) {
				src = target[ name ];
				copy = options[ name ];
				var descriptor = Object.getOwnPropertyDescriptor(options, name);
				if(typeof descriptor.get !== 'undefined') {
					Object.defineProperty(copy, name, descriptor);
				}
				
				if ( target === copy ) {
					continue;
				}
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) && (typeof descriptor.get === 'undefined') ) {
					if ( copyIsArray ) {
						copyIsArray = false;
						clone = src && jQuery.isArray(src) ? src : [];
					} else {
						clone = src && jQuery.isPlainObject(src) ? src : {};
					}
					//console.log(clone);
					target[ name ] = deepExtend( clone, copy );

				} else if ( copy !== undefined ) {
					var descriptor = Object.getOwnPropertyDescriptor(options, name);
					Object.defineProperty(target, name, descriptor);
				}
			}
		}
	}

	return target;
};


что-то типа такого получилось, на основе jQuery.extend
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ozknemoy
@ozknemoy
яваскриптист
Object.assign() не устраивает?
Ответ написан
Ваш ответ на вопрос

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

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