Как объединить пользовательские параметры с параметрами по умолчанию с помощью расширения jQuery (), когда параметры имеют массив свойств объектов

Как объединить пользовательский параметр с параметрами по умолчанию, используя extend()метод jQUery, когда объект options имеет свойство, имеющее значение, которое является массивом объектов

образец:

    var settings4 = $.extend({
      type: 'one-panel', // 'one-panel' | 'two-panel'
      sidebarTargets: [
        {
          targetKey: 'sidebar-one',
          initialLoadPanelKey: 'panel1',
          emptyPanelMessage: '',
          sidebarWrapSelectorId: 'sidebar-container',
          sidebarPanelWrapTemplate: '<div class="sidebar-panel {panelInitialSlideCss}" id="{panelSelectorId}" data-panel-key="{panelKey}"></div>',
          showHeader: true,
          headerTemplate: '<div class="sidebar-header" id="sidebar-header">Header text</div>',
        },
        // if sidebarSettings.type == one-panel, this is not required
        {
          targetKey: 'sidebar-two',
          initialLoadPanelKey: 'none',
          emptyPanelMessage: '<span>No Notebooks Notes Found',
          sidebarWrapSelectorId: 'sidebar-container',
          sidebarPanelWrapTemplate: '<div class="sidebar-panel" id="{panelSelectorId}" data-panel-key="{panelKey}"></div>',
          showHeader: true,
          headerTemplate: '<div class="sidebar-header" id="sidebar-header">Header text</div>',
        },
        {
          targetKey: 'right-content-panel',
          selectorId: 'sidebar-container',
          cssClassLIst: 'content-panel content',
          showLoader: true, // when AJAX content is loaded, show a loader spinner
          loaderTemplate: '',
          initialInnerContent: '',
        },
        {
          targetKey: 'right-content-iframe-panel',
          selectorId: 'sidebar-container',
          cssClassLIst: 'content-panel content',
          iframeNameAttribute: 'content',
          template: '<iframe id="content-frame" src="default.html" name="content" width="100%" height="100%" frameborder="0"></iframe>',
        }  
      ],
    }, sidebarOptions);

Свойство object выше sidebarTargetsявляется одним в вопросе. Он может содержать любое количество объектов в массиве. Как использовать опции jQuery extend to merge и обрабатывать подобные свойства?

1 ответ

  1. Я боюсь, что вы не можете сделать это с помощью jQuery's extendфункции .

    extend Если вы отправите свой первый аргумент, то сможете расширить имеющиеся у вас объекты true. Проблема в том, что у вас есть Arrays в вашем объекте, и extendне будет знать, что делать с этими массивами.

    Если вы можете изменить код на объекты, это будет работать отлично:

    var a = {
      a: ['a'],
      b: {
        'c': 1
      }
    }
    var b = {
      a: ['b'],
      b: {
        'd': 2
      }
    }
    $.extend(a, b)
    console.log('regular extend:')
    console.log(a);
    console.log('')
    
    var a = {
      a: ['a'],
      b: {
        'c': 1
      }
    }
    var b = {
      a: ['b'],
      b: {
        'd': 2
      }
    }
    $.extend(true, a, b)
    console.log('deep copy extend:')
    console.log(a);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>