Question

Je suis à la recherche d'une façon élégante de remplacer les valeurs dans un tableau associatif.

Par exemple, dire que j'ai mes options de base comme:

var base_options = {
    hintText:"something",
    borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED,
    width: 200, height: LABEL_HEIGHT-4,
    font: {fontSize:16}, left: 95
}

Je veux l'utiliser comme la base, mais être en mesure de passer outre quelques éléments dans cette base au cas par cas - par exemple, hintText serait différent pour chaque élément. Ce qui est une façon propre et élégante pour obtenir une copie de ce tableau avec quelques paramètres modifiés?

Je me rends compte que je peux changer chaque article, comme dans:

options.hintText = "new thing";

mais je pense qu'il ya une façon plus élégante.

Était-ce utile?

La solution

Vous pouvez utiliser une classe de base pour encapsuler le comportement Weston propose.

function Options(changed_options) {
     this.hintText = "something";
     this.borderStyle =Titanium.UI.INPUT_BORDERSTYLE_ROUNDED;
     // ...

     if(changed_options)
         for(var prop in changed_options) 
             this[prop] = changed_options[prop];
}

var foo = new Options({ "hintText":"changed"});

Le travail devrait.

Autres conseils

Je l'ai mis en œuvre cette fonction dans quelques de mes projets:

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;
    };
} 

Alors, maintenant, je peux l'utiliser comme:

Object.merge(options, {hintText: "new thing", left: 55});

En ce qui concerne les objets de la copie, il y a déjà un bon StackOverflow discussion à ce sujet.

Quelque chose comme ça?

var changed_options = { 
   hintText: "somethingElse",
   font: {fontSize: 24} 
}

for(var prop in changed_options) 
    base_options[prop] = changed_options[prop];
function merge(base, options) { 
   var result = {};
   for (var k in base) if (base.hasOwnProperty(k)) {
      result[k] = options[k] || base[k];
   } // note, it will leave out properties that are in options, but not in base..
   return result;
}

Si vous arrive d'utiliser jQuery, il a construit dans la méthode de extend sur l'objet jQuery qui fait cela.

Vous pouvez utiliser le prototype de l'objet pour établir l'héritage, comme ceci:

function inherited_object(extra_properties){
    for(var i in extra_properties){
        this[i] = extra_properties[i];
    }
}
function inherit_from(parent, extra_properties){
    inherited_object.prototype = parent;
    var obj = new inherited_object(extra_properties || {});
    inherited_object.prototype = null;
    return obj;
}

Alors, si vous avez un A objet vous suffit d'appeler B = inherit_from(A, B_stuff) et c'est tout. L'un des avantages est que, parce que A est le prototype de B, les changements effectués à A se reflètent sur B.

var base_options = function() { 
    hintText:arguments[0], 
    borderStyle:arguments[1], 
    width:arguments[2],
    height:arguments[3], 
    font:arguments[4]
    left:arguments[5]
};

var thisObj = new base_option(blah, blah, blah, blah, blah);

Cela peut sembler exagéré, mais vous pouvez ajouter à un tableau et utiliser une boucle pour eux tous les nouveaux cas où vous voulez / besoin de les changer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top