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 или массив.

Глубокая копия имеет значение, если одним из ваших свойств является другой объект. С глубоким расширением все свойства дочернего объекта объединяются, а не только сам дочерний объект.

Я думаю, вам нужно пойти с вашей собственной функцией расширения.