447 Stimmen

Erstellen eines Objekts mit dynamischen Schlüsseln

Zunächst einmal verwende ich Cheerio für den Zugriff und das Parsen von DOM mit Node.js. Gute Zeiten.

Hier ist die Situation:

Ich habe eine Funktion, mit der ich ein Objekt erstellen muss. Dieses Objekt verwendet Variablen sowohl für seine Schlüssel als auch für seine Werte und gibt dann dieses einzelne Objekt zurück. Beispiel:

stuff = function (thing, callback) {
  var inputs  = $('div.quantity > input').map(function(){
    var key   = this.attr('name')
     ,  value = this.attr('value');

     return { key : value }
  }) 

  callback(null, inputs);
}

Es gibt dies aus:

[ { key: '1' }, { key: '1' } ]

(.map() gibt ein Array von Objekten zurück, nur zur Information)

Ich benötige, dass key tatsächlich der String von this.attr('name') ist.

Was ist der beste Weg, um einen String als Schlüssel in Javascript zuzuweisen, wenn ich das versuche?

1172voto

Renato Zannon Punkte 26657

Im neuen ES2015-Standard für JavaScript (früher ES6 genannt) können Objekte mit berechneten Schlüsseln erstellt werden: Object-Initializer-Spezifikation.

Die Syntax lautet:

var obj = {
  [myKey]: value,
}

Angewendet auf das Szenario des Fragestellenden würde es wie folgt aussehen:

stuff = function (thing, callback) {
  var inputs  = $('div.quantity > input').map(function(){
    return {
      [this.attr('name')]: this.attr('value'),
    };
  }) 

  callback(null, inputs);
}

Hinweis: Ein Transpiler ist immer noch erforderlich für die Browser-Kompatibilität.

Mit Babel oder Googles Traceur ist es möglich, diese Syntax heute zu nutzen.


In früheren JavaScript-Spezifikationen (ES5 und darunter) wurde der Schlüssel in einem Objektliteral immer wortwörtlich als Zeichenkette interpretiert.

Um einen "dynamischen" Schlüssel zu verwenden, müssen Sie die Klammernotation verwenden:

var obj = {};
obj[myKey] = value;

In Ihrem Fall:

stuff = function (thing, callback) {
  var inputs  = $('div.quantity > input').map(function(){
    var key   = this.attr('name')
     ,  value = this.attr('value')
     ,  ret   = {};

     ret[key] = value;
     return ret;
  }) 

  callback(null, inputs);
}

72voto

Denys Séguret Punkte 355205

Sie können kein Objektliteral mit einem dynamischen Schlüssel definieren. Machen Sie dies:

var o = {};
o[key] = value;
return o;

Es gibt keinen Shortcut (edit: jetzt gibt es einen mit ES6, siehe die andere Antwort).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X