objeto funciones funcion dinamicas dinamica crear array alternativa javascript syntax object-literal

funciones - javascript string to function



Use una cadena concatenada(dinĂ¡mica) como clave de objeto de JavaScript? (6)

Esta pregunta ya tiene una respuesta aquí:

var test = "test123" var test123 ={ "key" + test: 123 }

Este código no funciona. ¿Qué está mal con "clave" + prueba?


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

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


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

  1. object.propertyName = value;

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

object.(''property''+''Name'')

como puedes ver

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

son iguales

  1. puede usar una variable como nombre de propiedad con "[]";

tu puedes hacer :

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

y esta vez tienes que usar una cuerda

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


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

Debe usar la notación [] después de crear el objeto para dicha clave dinámica:

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

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

Entonces, los únicos tipos de claves que puede usar 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


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

var test123 = {}; test123["foo" + "bar"] = ''baz''; test123.foobar === ''baz''; // true


Su código es equivalente a test123.("key" + test) = 123 que puede ayudarlo a comprender mejor por qué es incorrecto.

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


--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"]**