2012-06-05 6 views
10

Lo que tengo y lo que necesito. Es fácil. (Propiedades no están anidados)

Las opciones por defecto:

{ 
    sDom: 'frt<"tfoot"lp>', 
    bInfo: false, 
    sPaginationType: "full_numbers", 
    oLanguage: { 
    sSearch: "", 
    sLengthMenu: "Show _MENU_", 
    oPaginate: { 
     sFirst:  "|<<", 
     sLast:  ">>|", 
     sNext:  ">>", 
     sPrevious: "<<" 
    } 
    } 
} 

Opciones reales:

{ 
    oLanguage: { 
    oPaginate: { 
     sNext:  "MODIFIED" 
    } 
    } 
} 

El resultado de $ .extend:

{ 
    sDom: 'frt<"tfoot"lp>', 
    bInfo: false, 
    sPaginationType: "full_numbers", 
    oLanguage: { 
    oPaginate: { 
     sNext:  "MODIFIED" 
    } 
    } 
} 

Lo que necesito es a extender apropiadamente las opciones predeterminadas con las opciones reales y obtener el siguiente resultado (una propiedad ha sido modificada):

{ 
    sDom: 'frt<"tfoot"lp>', 
    bInfo: false, 
    sPaginationType: "full_numbers", 
    oLanguage: { 
    sSearch: "", 
    sLengthMenu: "Show _MENU_", 
    oPaginate: { 
     sFirst:  "|<<", 
     sLast:  ">>|", 
     sNext:  "MODIFIED" 
     sPrevious: "<<" 
    } 
    } 
} 

El problema es que $ .extend función ignora propiedades anidadas y opera propiedades sólo de primer nivel. Ahora tengo $ extender manualmente cada una de las propiedades anidadas, pero supongo que no es una solución.

Respuesta

37

Usted necesita a recursive copy pasando true como primer parámetro:

var defaults = {...} 
var actual = {...} 

//recursively merge to a blank object 
console.log($.extend(true,{}, defaults, actual))​ 
Cuestiones relacionadas