2012-03-14 18 views

risposta

58

Perché "key" + test è un'espressione e non un identificatore né una stringa letterale né un numero letterale, che sono le uniche cose consentite come chiave in un oggetto letterale.

Devi usare la notazione [] dopo aver creato l'oggetto per una chiave così dinamico:

var test123 = {}; 
test123["key" + test] = 123; 

Un identificatore è fondamentalmente lo stesso sottoinsieme di caratteri che si può chiamare una variabile (lettere, numeri, _ e $; potrebbe non iniziare con un numero) e una stringa letterale è qualsiasi stringa inclusa con ' o ".

Quindi, gli unici tipi di chiavi è possibile utilizzare in un oggetto letterale sono:

{ 
    a0: true, // valid identifier 
    $$_: true, // same 
    123: true, // valid numeric literal 
    012: true, // same (octal) 
    0xf: true, // same (hex) 
    "@": true, // not allowed as an identifier 
    '0a': true // same 
} 

Riferimento: http://es5.github.com/#x11.1.5.

PropertyName:

IdentifierName

letterale stringa

NumericLiteral

+3

Inoltre, i numeri sono consentiti anche nel letterale dell'oggetto, come '0' o' 5e10' (ma non '-10' perché' -' non fa parte del numero letterale ma dell'operatore '' 'unario). –

+0

@Felix Kling: In effetti lo sono, grazie. – pimvdb

10

È possibile ma non con la notazione letterale (pre ES6).

var test123 = {}; 
test123["foo" + "bar"] = 'baz'; 

test123.foobar === 'baz'; // true 
+0

Grazie per la semplice risposta, è proprio quello che stavo cercando :) –

3

Il codice è equivalente al test123.("key" + test) = 123 che può meglio aiutare a capire il motivo per cui è sbagliato.

È necessaria la notazione ["name"] per poter accedere ai campi con il loro nome in stringa. Altre notazioni (le tue e .) richiedono identificatori.

-3
--HTML-- 
<div id="name1"></div> 
<div id="name2"></div> 
<div id="name3"></div> 

--JS-- 
    function getJsonData(){ 
    var hr = new XMLHttpRequest(); 
    hr.open("GET", "bookJson.json", true); 
    hr.setRequestHeader("Content-type", "application/json", true); 
    hr.onreadystatechange = function() { 
    if(hr.readyState == 4 && hr.status == 200) { 

    var data = JSON.parse(hr.responseText); 
    for(var i=0;i<3;i++){ 
    var a = "p"+(i+1)+"H"; 
    $("#name"+(i+1)).html(data[objName][a]); 
    } 


    } 

} 
    hr.send(null); 
} 

---JSON--- save JSON file name as bookJson.json 
{ "objName": 
    { 
    "p1H":"content1", 
    "p2H":"content2", 
    "p3H":"content3", 
    } 
    } 
----------------------------------- 
json object key name p1H,p2H,p3H ... 
We want to dynamically get this keys in javacript instead of **data[objName].p1H**. you can get dynamical key like **data[objName]["p1H"]** 
+0

Si prega di fornire una spiegazione della risposta per aiutare gli altri utenti del sito. Le risposte al solo codice non sono molto utili e tendono ad essere contrassegnate come di bassa qualità e potenzialmente cancellate. – Tristan

+0

Grazie per il suggerimento, ho fornito una spiegazione della mia risposta ... –

1

JavaScript fornisce due modi per definire una proprietà di un oggetto:

  1. object.propertyName = valore;

In questa situazione, propertyName non è modificabile e non è calcolabile.non è possibile effettuare le seguenti operazioni:

object.('property'+'Name') 

come si può vedere

object = {propertyName:value}; 
    object = {'propertyName':value}; 

sono uguali

  1. è possibile utilizzare una variabile come il nome della proprietà con "[]";

si può fare:

var a = "propertyName"; 
object[a] = value; 

e questa volta è necessario utilizzare una stringa

object[propertyName] = value;//error 
object["propertyName"] = value;//correct 
object = {'propertyName':value};//correct 
object = {propertyName:value};//correct 
29

Con ES6, è possibile definire i tasti dinamici all'interno di un oggetto letterale:

const test = "test123" 
const test123 = { ["key" + test]: 123 }; 
Problemi correlati