Frage

Ich bin auf der Suche nach einem eleganten Weg, um Werte in einem assoziativen Array außer Kraft zu setzen.

Zum Beispiel, sagen, ich habe meine Basis Optionen wie:

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

Ich möchte dies als Basis verwenden, aber die Lage sein, auf einer Fall-zu-Fall-Basis ein paar Artikel in dieser Basis außer Kraft zu setzen - zum Beispiel, würde hintText für jedes Element unterschiedlich sein. Was ist eine saubere und elegante Möglichkeit, eine Kopie dieses Arrays mit ein paar Parameter geändert zu bekommen?

Ich weiß, ich kann jedes einzelne Element ändern, wie in:

options.hintText = "new thing";

, aber ich vermute, es ist ein eleganter Weg.

War es hilfreich?

Lösung

Sie können eine Basisklasse verwenden, das Verhalten zu kapseln Weston vorzuschlagen.

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

Should Arbeit.

Andere Tipps

habe ich diese Funktion in einigen meiner Projekte umgesetzt:

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

So, jetzt kann ich es wie verwenden:

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

Was Objekte kopieren, gibt es bereits eine gute Stackoverflow Diskussion darüber.

So etwas wie das?

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

Wenn Sie werden mit jQuery passieren, ist es ein in extend Methode auf dem jQuery-Objekt gebaut, das dies tut.

Sie können die Objekt Prototyp verwenden, um die Erbschaft zu etablieren, wie folgt aus:

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

Wenn Sie dann einen Gegenstand A haben, rufen Sie einfach B = inherit_from(A, B_stuff) und das ist es. Ein Vorteil ist, dass, weil A der Prototyp B ist, getan Änderungen A auf B reflektiert.

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

Das mag übertrieben erscheinen, aber dann können Sie alle neuen Instanzen zu einem Array hinzufügen und eine für sie für Schleife verwenden, wenn Sie wollen / müssen, sie ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top