2010-11-01 10 views
45

Ich habe ein JSON-Objekt voller ips wiedynamisch Variablennamen Wert-Paare zu JSON-Objekt

var ips = {} 

ich dann wie IP-Objekte zu diesem Objekt hinzufügen, so

ips[ipID] = {} 

ich dann müssen hinzufügen dynamisch/variabele Paare Name Wert jedes ip so verwende ich Code wie diese

var name; var value; var temp = {}; 
tmp[name] = value 

Meine Frage ist, wie kann ich hinzufügen se Name Wert-Paare/tmp auf meine IPID Objekte, so dass mein Ergebnis stellt sich heraus, wie

ipID = { name : value, anotherName : anotherValue } 
+2

Benötigen Sie auch Code, um den endgültigen JSON zu erzeugen? – orangepips

+0

möglich Duplikat von [Verwenden einer Variablen für einen JavaScript-Objektschlüssel] (http://stackoverflow.com/questions/2274242/using-a-variable-for-a-javascript-object-key) – Bergi

Antwort

134

Das ist nicht JSON. Es sind nur Javascript-Objekte, und es hat überhaupt nichts mit JSON zu tun.

Sie können Klammern verwenden, um die Eigenschaften dynamisch festzulegen. Beispiel:

var obj = {}; 
obj['name'] = value; 
obj['anotherName'] = anotherValue; 

Dies genau wie das Erstellen Sie das Objekt mit einem Objekt wörtlichen wie dies das gleiche gibt:

var obj = { name : value, anotherName : anotherValue }; 

Wenn Sie bereits das Objekt in die ips Sammlung hinzugefügt, Sie verwenden ein Paar Klammern das Objekt in der Sammlung für den Zugriff, und ein anderes Paar der propery in dem Objekt zuzugreifen:

ips[ipId] = {}; 
ips[ipId]['name'] = value; 
ips[ipId]['anotherName'] = anotherValue; 

Hinweis Ähnlichkeit mit dem Code, oben, aber dass y Sie verwenden nur ips[ipId] anstelle von obj.

Sie auch einen Verweis auf das Objekt wieder aus der Sammlung bekommen, und dass das Objekt zuzugreifen verwenden, während es in der Sammlung bleibt:

ips[ipId] = {}; 
var obj = ips[ipId]; 
obj['name'] = value; 
obj['anotherName'] = anotherValue; 

Sie String-Variablen verwenden können, die Namen der spezifizieren Eigenschaften:

var name = 'name'; 
obj[name] = value; 
name = 'anotherName'; 
obj[name] = anotherValue; 

es ist Wert der variablen (die Zeichenkette), die die Eigenschaft identifiziert, also, während Sie obj[name] für beiden Eigenschaften in dem obigen Code verwenden, ist es die Zeichenfolge in den variablen im Moment ist, dass Sie es zugreifen, die bestimmt was p Eigenschaft wird zugegriffen.

+0

Das würde gut funktionieren, aber meine Namen sind auch Variablen. Wenn der Name geändert wird, wird das vorherige Name-Wert-Paar überschrieben. – Mike

+0

@Mike: Sie können eine Variable verwenden, um den Namen der Eigenschaft anzugeben. Es ist der Wert der Variablen zum Zeitpunkt des Zugriffs auf das Objekt, der entscheidet, auf welche Eigenschaft zugegriffen wird. Daher ist das Ändern der Variablen in eine andere Zeichenkette zwischen Zugriffen kein Problem. Siehe meinen Zusatz oben. – Guffa

+0

Nun, ich benutze eine .change-Funktion, um dies zu generieren, und aus irgendeinem Grund überschreibt es meinen Namen. Gibt es überhaupt eine temporäre Differenzierung der Variablen? – Mike

5

ich jeden Eintrag unter der Annahme, in „ips“ können mehrere Namen Wertepaare haben - so ist es verschachtelt. Sie können diese Datenstruktur als solche erreichen:

var ips = {} 

function addIpId(ipID, name, value) { 
    if (!ips[ipID]) ip[ipID] = {}; 
    var entries = ip[ipID]; 
    // you could add a check to ensure the name-value par's not already defined here 
    var entries[name] = value; 
} 
6

wenn JavaScript-Objekte verwenden, können Sie auch "Punktnotation", um ein Element hinzu, (which JSLint prefers)

var myArray = { name : "john" }; 
//will initiate a key-value array with one item "name" and the value "john" 
myArray.lastName = "smith"; 
//will add a key named lastName with the value "smith" 
//Object {name: "john", lastName: "smith"} 

Hier ist ein Screenshot von Tests in der Chrome-Konsole

screenshot

verwenden nur
+0

Ist 'myArray' wirklich ein Array? Es scheint ein' Objekt' oder Hash zu sein. –

+0

yep, myObject wäre eine bessere Namenswahl gewesen. – Max

1

Von dem, was die anderen Antworten vorgeschlagen haben, glaube ich, diese helfen könnten:

var object = ips[ipId]; 
var name = "Joe"; 
var anothername = "Fred"; 
var value = "Thingy"; 
var anothervalue = "Fingy"; 
object[name] = value; 
object[anothername] = anothervalue; 

Dies ist jedoch nicht getestet, nur eine Annahme, auf der Grundlage der ständigen Wiederholung von:

object["string"] = value; 
//object = {string: value} 
2

in Javascript.

var myObject = { "name" : "john" }; 
    // { "name" : "john" }; 
    myObject.gender = "male"; 
    // { "name" : "john", "gender":"male"}; 
+0

Ich erhalte eine Fehlermeldung "myObject.push is not eine Funktion "wenn ich das versuche. – danjuggler

9

Mit ECMAScript 6 gibt es einen besseren Weg.

Sie können computed property names in Definitionen Objekteigenschaft, zum Beispiel:

var name = 'John'; 
var value = '42'; 
var name2 = 'Sarah'; 
var value2 = '35'; 

var ipID = { [name] : value, [name2] : value2 } 

Dies ist für die Eigenschaftsnamen mit Variablen zu Folgendem ummünzen, wie gewünscht.

var ipID = { John: "42", Sarah: "35" }