2012-06-14 12 views
7

Chciałbym stworzyć json obiekt do wysyłania jako tablica postu, ale trzeba utworzyć klucz w locieTworzenie kluczy json w locie

var id = $('#myInput').val(); 

var post = { 
    'product[123]': 'myValue',  // this works fine - but isn't dynamic 
    'product['+id+']': 'myValue' // this does not work 
} 

wysłaniem go jako ciąg działa dobrze, ale pojawia się problem, gdy chcę uczynić go bardziej dynamicznym. Czy brakuje tu czegoś naprawdę prostego, czy też próbuję zrobić coś, czego JavaScript nie powinien robić?

+1

To jest po prostu "obiektu", a nie "obiekt JSON". –

+0

Czy próbowałeś tego: http://stackoverflow.com/questions/920930/how-to-create-json-by-javascript-for-loop? – msanford

Odpowiedz

17

(Zauważ, że to nie ma nic wspólnego z JSON. Nie używasz tam JSON, używasz object initializer. JSON to format tekstowy (nie kod), który jest podzbiór składni inicjator obiektu javascript w)

Zrób to poza inicjowania obiektu, używając [] notacji.

var id = $('#myInput').val(); 

var post = {}; 
post[product[id]] = 'myValue'; 

To zajmie wartość (w czasie wykonywania) product[id] i użyje jej jako klucza do właściwości. Jeśli chciał klucz do dosłownie być product[123] gdy id jest 123, można użyć zamiast tego:

post['product[' + id + ']'] = 'myValue'; 

Bardziej ogólne omówienie:

var a = "foo"; 
var obj = {}; 
obj[a] = "bar"; 
console.log(obj.foo); // "bar" 

JavaScript pozwala na określenie kluczy własności w dwa sposoby: użycie notacji kropkowanej i literału (obj.foo) lub użycie notacji w nawiasie i ciągu (obj["foo"]). W tym drugim przypadku ciąg nie musi być literałem ciągowym, może być wynikiem dowolnego wyrażenia.

+1

Zinterpretowałem pytanie jako dosłownie chcące atrybutu o nazwie "produkt [123]", ale pytanie w ogóle nie jest jasne ... – Matt

+0

@Matt: Widzę twoją interpretację, dziękuję. Nie przeczytałbym tego w ten sposób, ale teraz to wskazałeś ... :-) –

0

Spróbuj

post['product[' + id + ']'] = 'myValue'; 
0

Dlaczego używasz "[]" w identyfikatorach obiektu? Unikaj tego.
W swojej próbie, można to zrobić za pomocą następującego kodu:

var id = $('#myInput').val(); 
var post = { 
    '123': 'myValue',  
    id: 'myValue' 
} 

Lub, jeśli naprawdę naprawdę chcesz używać arrry (faktycznie, wszystkie obiekty są tablicy w JavaScript). można napisać to:

var product=[]; 
product['123']='something'; 
product[id]='another'; 
+0

Spowoduje to utworzenie obiektu ('post') z atrybutem' 123' i atrybutem 'id' ([demo] ] (http://jsfiddle.net/sH38n/)). Co więcej, nie ma w tym nic złego, używając '[]' w nazwie atrybutu. – Matt

+0

Twój kod tworzy obiekt z nazwami właściwości '123' i' id'. Nie ** używa ** wartości zmiennej 'id'. –

+0

Wszystko w JavaScript jest obiektem, a nie odwrotnie; nie jest prawdą, że wszystkie obiekty są tablicami. – Matt