43 votes

Combinaison d'objets JavaScript en un seul

J'ai une fonction appelée "Colorbox" (plugin jQuery) qui prend un certain nombre de paramètres comme ceci:

$(this).colorbox({
    width : "500px",
    height : "500px"
});

J'ai plusieurs différents types de "ce", chacun avec leurs propres propriétés. Comme suit:

var Type = {
  video: {
    width : "500px",
    height : "500px"
  },
  gallery: {
    width : "1065px",
    height : "600px"
  }
}

Au-delà de cela, j'ai d'autres comportements, de la logique, et un "défaut" du groupe de paramètres (qui d'être écrasés par d'autres, plus spécifiques). Ce que j'essaie de faire est de pousser tous les paramètres appropriés, à partir de plusieurs objets, un seul Objet, donc je peux juste appeler:

$(this).colorbox(Settings);

Comment puis-je transférer un groupe inconnu de propriétés et leurs valeurs (par exemple "largeur" et "hauteur") de quelque chose comme Type.vidéo dans les Paramètres? L'objectif est d'être en mesure de Paramètres d'appel.la hauteur et la valeur que j'ai poussé dans.

82voto

Matthew Manela Points 9610

Jetez un coup d’œil à la méthode d’ extension JQuery. Il peut fusionner deux objets et toutes leurs propriétés.

De la page d'exemple de JQuery:

 var settings = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
jQuery.extend(settings, options);
 

Paramètres contient maintenant les objets de paramètres et d’options fusionnés.

12voto

mummybot Points 195

Une solution non jQuery est:

 YOUROBJ.vars = {
    vars1: {
        vars1_1: 'an object which will overwrite',
        vars1_2: 'an object which will be added'
    }
};

YOUROBJ.vars2 = (!YOUROBJ.vars) ? {} : YOUROBJ.vars;

YOUROBJ.vars = {
    vars1: {
        vars1_1: 'an object which will be overwritten',
        vars1_3: 'an object which will remain'
    }
};

YOUROBJ.extend = function(obj, defaults) {
    for (var i in defaults) {
        if (!obj[i]) {
            obj[i] = defaults[i];
        } else {
            FC.extend(obj[i], defaults[i]);
        }
    }
};
YOUROBJ.extend(YOUROBJ.vars, YOUROBJ.vars2);
delete YOUROBJ.vars2;
 

Ceci est utile si vous souhaitez ajouter une variable à un objet de fonctions générales avant son chargement et sa création.

Cela permet également au second YOUROBJ.vars d'agir comme paramètre par défaut.

6voto

Brian Landau Points 86

Si vous utilisez jQuery, vous devriez vérifier la fonction $ .extend .

Vous pouvez essayer quelque chose comme ça:

 $.fn.somePlugin = function(options){
  settings = $.extend(true, {default_values: "foo"}, options);
}
 

4voto

palswim Points 4353

J'ai également créé une fonction de "fusion" en Javascript à utiliser pour mes besoins généraux:

 if (typeof Object.merge !== 'function') {
    Object.merge = function (o1, o2) { // Function to merge all of the properties from one object into another
        for(var i in o2) { o1[i] = o2[i]; }
        return o1;
    };
} 
 

Usage:

 var eDiv = document.createElement("div");
var eHeader = Object.merge(eDiv.cloneNode(false), {className: "header", onclick: function(){ alert("Click!"); }});
 

C'est plus rapide et plus sale (copie superficielle), mais c'est ce que j'ai besoin de faire.

3voto

mck89 Points 8661

Je ne comprends pas très bien votre question mais je pense que vous devriez utiliser la fonction $ .extend:

 Settings=$.extend(Settings, Type.video);
 

De cette manière, les paramètres obtiendront les propriétés Type.video.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X