JQuery Deep/Recursive Copy с использованием $.extend
Я пытаюсь объединить два объекта, используя jQuery $.extend.
Используя следующий код, я пытаюсь предупредить ( "Ball - Stump - Umpire" ). Но текущий выход ( "Undefined - Stump - Umpire" ). Он не достигает глубокой (рекурсивной) копии. Как мы это исправим?
$(document).ready(function () {
debugger;
//$.extend
var obj3 = { throwable: { text1: 'Ball' }, text3: 'Umpire' };
var obj4 = { throwable: { text4: 'Bat' }, text2: 'Stump' }
//Simple Copy
var result1 = $.extend(obj3, obj4);
//alert(result1.throwable.text4 + " - " + result1.text2 + " - " + result1.text3);
//Deep Copy
//First parameter is passed as Boolean true to accomplish deep (recursive) copy
var result2 = $.extend(true, obj3, obj4);
alert(result2.throwable.text1 + " - " + result2.text2 + " - " + result2.text3);
});
ИЗМЕНИТЬ: Я назвал
(Глубокое) копирование массива с помощью jQuery
Ответы
Ответ 1
Второй фрагмент кода работает должным образом и выполняет глубокую копию obj4
в obj3
, когда выполняется изолированно.
Проблема в том, что предыдущий фрагмент кода уже выполнил неглубокую копию obj4
в obj3
, полностью переопределив ее член throwable
с помощью obj4
в этом процессе. Поэтому throwable.text1
больше не существует в obj3
после этого кода.
-
Изначально obj3
:
{ throwable: { text1: 'Ball' }, text3: 'Umpire' }
-
После выполнения первого фрагмента кода obj3
становится:
{ throwable: { text4: 'Bat' }, text3: 'Umpire', text2: 'Slump' }
-
Наконец, после выполнения второго фрагмента кода obj3
все еще:
{ throwable: { text4: 'Bat' }, text3: 'Umpire', text2: 'Slump' }
Ответ 2
В вашем коде свойство text1
перезаписывается extend
. Я хочу, чтобы метод, который связывает строки, кодирует ваш собственный, extend
не делает этого.
Что-то вроде:
function(o1, o2) {
var ores = {};
for(var p in o1) ores.p = o1.p;
for(var p in o2) ores.p = ores.p ? ores.p+o2.p : o2.p;
return ores;
}
Ответ 3
Проблема состоит в том, что в объектах есть два свойства с тем же именем: text1. Даже с глубокими расширениями, jquery extend не объединяет это в новую строку concat или массив.
Глубокая копия имеет значение, если одним из ваших свойств является другой объект. С глубоким расширением все свойства дочернего объекта объединяются, а не только сам дочерний объект.
Я думаю, вам нужно пойти с вашей собственной функцией расширения.