So legen Sie einen JS-Objekteigenschaftsnamen aus einer Variablen fest


177

Ich muss einen JS-Objekteigenschaftsnamen dynamisch festlegen.

for(i=1; i<3; i++) {
    var key  = i+'name';

    data = {
        key : 'name1',
    }
}

Ergebnis sollte sein:

data = {
    1name: 'name1'
    2name: 'name1'
}

Wenn sie sequentiell sind, warum verwenden Sie kein Array?
Epascarello

Ich möchte wissen, welche drei von Ihnen den falschen Pfeil getroffen haben. Komm schon, mach schon.
Charles

Antworten:


193
var jsonVariable = {};
for(var i=1; i < 3; i++) {
  jsonVariable[i + 'name'] = 'name' + i;        
}

4
Musas Antwort unten artikuliert auch richtig, dass die Verwendung der [] Notation tatsächlich der einzige Weg ist, dies zu tun.
Dennis Plucinik

1
Beachten Sie auch, dass @ ChilNuts Antwort unten jetzt den einfachsten Weg beschreibt, dies mit ES6 zu tun
Rambossa

1
Tatsächlich wird mit der neuen Syntax das, was OP erreichen will, nur möglich sein, wenn das Schleifenlimit fest codiert und klein ist.
Musa

166

Sie müssen die []Notation verwenden, um Schlüssel dynamisch festzulegen.

var jsonVariable = {};
for(i=1; i<3; i++) {        
 var jsonKey  = i+'name';
 jsonVariable[jsonKey] = 'name1';

}

In ES6 können Sie jetzt die Objektliteral-Syntax verwenden, um Objektschlüssel dynamisch zu erstellen. Fügen Sie einfach die Variable ein []

var key  = i + 'name';
data = {
    [key] : 'name1',
}

3
jsonVariable = {}; sollte nicht innerhalb der for-Schleife initialisiert werden.
Schließung

Auch Sie machen jsonVariable hier global
Dennis Plucinik

129

Mit ECMAScript 6 können Sie variable Eigenschaftsnamen mit der Objektliteral-Syntax wie folgt verwenden:

var keyName = 'myKey';
var obj = {
              [keyName]: 1
          };
obj.myKey;//1

Diese Syntax ist in den folgenden neueren Browsern verfügbar:

Edge 12+ (keine IE-Unterstützung), FF34 +, Chrome 44+, Opera 31+, Safari 7.1+

( https://kangax.github.io/compat-table/es6/ )

Sie können älteren Browsern Unterstützung hinzufügen, indem Sie einen Transpiler wie babel verwenden . Es ist einfach, ein gesamtes Projekt zu transpilieren, wenn Sie einen Modulbündler wie Rollup oder Webpack verwenden .


2
Vielen Dank für das Hinzufügen der fantastischen ES6-Syntax
Rambossa

Ohne ES6 kann ich var payload = {dynamicKey: val} nicht definieren. Ich muss var payload = {} und payload [variableName] = val ausführen.
Sainath SR

23

Auf diese Weise können Sie den Wert dynamisch einstellen

var jsonVariable = {};
for (var i = 1; i < 3; i++) {
    var jsonKey = i + 'name';
    jsonVariable[jsonKey] = 'name' + i;
}

20

Verwenden Sie eine Variable als Objektschlüssel

let key = 'myKey';

let data = {[key] : 'name1'; }

Hier erfahren Sie, wie Sie Ihr Objekt iterieren


Können Sie bitte etwas näher darauf eingehen, um anderen mitzuteilen, warum dies eine Lösung sein könnte?
Phaberest

Die Informationen, die Sie hinzugefügt haben, sind in Ordnung, geben Sie nur niemals eine Antwort mit nur Code;)
Phaberest

7

Es spielt keine Rolle, woher die Variable kommt. Hauptsache wir haben eins ... Setzen Sie den Variablennamen in eckige Klammern "[..]".

var optionName = 'nameA';
var JsonVar = {
[optionName] : 'some value'
}

Das funktioniert gut, ich frage mich, ob es in allen Browsern / Versionen funktioniert
Mercury

1
jsonVariable = {}
for(i=1; i<3; i++) {        
   var jsonKey  = i+'name';
   jsonVariable[jsonKey] = 'name1'
}

Dies wird ähnlich sein wie

    jsonVariable = {
    1name : 'name1'
    2name : 'name1'
}

0

In Anlehnung an den obigen Kommentar von Sainath SR konnte ich einen js-Objekteigenschaftsnamen aus einer Variablen in Google Apps Script (die ES6 noch nicht unterstützt) festlegen, indem ich das Objekt definierte und dann einen anderen Schlüssel / Wert außerhalb des Objekts definierte:

var salesperson = ...

var mailchimpInterests = { 
        "aGroupId": true,
    };

mailchimpInterests[salesperson] = true;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.