Argumentliste mit variablen Schlüsseln

en2k

Erfahrenes Mitglied
Hallo,

folgender Code liegt meinem Problem zugrunde:

PHP:
meine_funktion = function(optionen) {
  alert(optionen.toSource());
}

schluessel = 'test1';
meine_funktion({schluessel: 'wert1'});

Frage Nr. 1: Wie nennt man diese Variablenlisten (oben im Funktionsaufruf als übergebener Parameter) korrekt in JS? Variablenlisten? Das war mein Problem beim Googlen und bei der Boardsuche.
Frage Nr. 2: Sind diese Listen Bestandteil von JS? Oder werden sie nur durch Frameworks wie jQuery o.Ä. hinzugefügt?
Frage Nr. 3 - und eigentlich meine Hauptfrage: Wenn ich mir optionen.toSource() ausgeben lasse, dann erhalte ich als Schlüssel den String 'schluessel'. Aber eigentlich hätte ich ja gerne, dass er schluessel als Variable betrachtet und der Funktion 'wert1' unter dem Schlüssel 'test1' übergibt.

Ich bin momentan etwas ratlos, da ich auch schon verschiedene Möglichkeiten probiert habe, aber man anscheinend in JS keine Operationen innerhalb der geschweiften Klammern wie etwa 'test'+i für i=1 durchführen darf.

Vielen Dank im Voraus - eventuell auch für einen aufklärenden Link.

Nino
 
Hi,

Frage 1:
Diese Form nennt sich Objekt-Literal - mehr dazu zum Beispiel hier.

Frage 2:
Ja, sie sind Bestandteil von JS.

Frage 3:
Vielleicht hilft dir die eval-Funktion.
Code:
meine_funktion = function(optionen) {
  alert(optionen.test1);
}

schluessel = 'test1';
meine_funktion(eval("({"+schluessel+": 'wert1'})"));

Ciao
Quaese
 
Vielen Dank für die Aufklärung ;-)

Hmm... geht das nicht anders? evals sind halt schon ganz schön hässlich.
 
Hi,

eine andere Möglichkeit. Über die Methode apply des Function-Objekts.
Code:
meine_funktion = function(optionen) {
  var strOut = "";
  for(var strEntry in optionen){
    strOut += "optionen["+strEntry+"] = " + optionen[strEntry] + "\n";
  }
  alert(strOut + "\nAusgabe über Punktnotation: optionen.test1 = " + optionen.test1);
}

var schluessel = 'test1';

meine_funktion((function(){
  // Übergebenes Array mit Schluessel-Wert-Tupeln durchlaufen
  for(var i=0; i<arguments.length; i++){
  // Wert aus Tupel dem Schlüssel aus dem Tupel im neuen Objekt zuordnen
    this[arguments[i][0]] = arguments[i][1];
  }

  // Erweitertes Objekt zurückgeben
  return this;
// Objekt erweitern:
// 1. Parameter: Objekt, das erweitert werden soll
// 2. Parameter: Array aus Schlüssel-Wert-Tupeln [[schluessel1, wert1],[schluessel2, wert2],...]
}).apply({'schon_da': 'stimmt'}, [[schluessel, 'wert1'], ['noch_n', 'Gedicht']]));
Das Ausgangsobjekt wird einer Funktion übergeben. Die Schlüssel-Wert-Paare, um die es erweitert werden soll, als Array im zweiten Argument. In diesem Array können Variable enthalten sein.
In der Funktion selbst wird das Objekt erweitert und zurückgegeben.

[EDIT]
Das Ganze etwas flexibler über eine Funktion:
Code:
/*
 * Die Funktion erweitert ein Objekt (_this) im Schlüssel-Wert-Paare, die in einem Array übergeben werden
 *
 * Parameter: _this    : (object) Objekt, das erweitert werden soll
 *            arrKeyVal: (array) Array, das aus Schlüssel-Wert-Paaren besteht, [[schluessel1, wert1],[schluessel2, wert2],...]
 *
 * Rückgabe: (object) Das erweiterte Objekt
 */
var qp_extend = function(_this, arrKeyVal){
  return (function(){
    // Übergebenes Array mit Schluessel-Wert-Tupeln durchlaufen
    for(var i=0; i<arguments.length; i++){
      // Wert aus Tupel dem Schlüssel aus dem Tupel im neuen Objekt zuordnen
      this[arguments[i][0]] = arguments[i][1];
    }

    return this;
    // Objekt erweitern:
    // 1. Parameter: Objekt, das erweitert werden soll
    // 2. Parameter: Array aus Schlüssel-Wert-Tupeln [[schluessel1, wert1],[schluessel2, wert2],...]
  }).apply(_this, arrKeyVal);
}

meine_funktion = function(optionen) {
  var strOut = "";
  for(var strEntry in optionen){
    strOut += "optionen["+strEntry+"] = " + optionen[strEntry] + "\n";
  }
  alert(strOut + "\nAusgabe über Punktnotation: optionen.test1 = " + optionen.test1);
}

schluessel = 'test1';

meine_funktion(qp_extend({'schon_da': 'stimmt'}, [[schluessel, 'wert1'], ['noch_n', 'Gedicht']]));
[/EDIT]

Ciao
Quaese
 
Zurück