2012-03-14 13 views

Respuesta

58

Porque "key" + test es una expresión y no un identificador ni un literal de cadena ni un número literal, que son las únicas cosas permitidas como la clave en un literal de objeto.

usted tiene que utilizar la notación [] después de crear el objeto de una clave tan dinámico:

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

Un identificador es básicamente el mismo subconjunto de caracteres que se puede llamar una variable (letras, números, _ y $; no puede comenzar con un número), y un literal de cadena es cualquier cadena incluida con ' o ".

Así, los únicos tipos de teclas que puede utilizar en un objeto literal son:

{ 
    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 
} 

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

PropertyName:

IdentifierName

StringLiteral

NumericLiteral

+3

Además, también se permiten números en el objeto literal, como '0' o' 5e10' (pero no '-10' porque' -' no es parte del número literal pero el operador unario '-'). –

+0

@Felix Kling: De hecho lo son, gracias. – pimvdb

10

Puede pero no con notación literal (pre ES6).

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

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

Gracias por la respuesta simple, eso es justo lo que estaba buscando :) –

3

Su código es equivalente a test123.("key" + test) = 123 mejor que puede ayudar a entender por qué está mal.

Necesita la notación ["name"] para poder acceder a los campos por su nombre en una cadena. Otras anotaciones (la suya y . una) requieren identificadores.

-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

Proporcione una explicación de su respuesta para ayudar a otros usuarios del sitio. Las respuestas de solo código no son muy útiles y tienden a marcarse como de baja calidad y potencialmente eliminadas. – Tristan

+0

Gracias por su sugerencia, proporcioné una explicación de mi respuesta ... –

1

Javascript proporciona dos maneras de definir una propiedad de un objeto:

  1. object.propertyName = valor;

En esta situación, el propertyName no se puede editar, y no se puede calcular.no se puede hacer lo siguiente:

object.('property'+'Name') 

como se puede ver

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

son iguales

  1. se puede utilizar una variable como el nombre de la propiedad con "[]";

que puede hacer:

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

y esta vez usted tiene que utilizar una cadena

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

Con ES6, puede definir claves dinámicas dentro de un objeto literal:

const test = "test123" 
const test123 = { ["key" + test]: 123 }; 
Cuestiones relacionadas