var test = "test123"
var test123 ={
"key" + test: 123
}
This code doesn't work. What is wrong with "key" + test ?
var test = "test123"
var test123 ={
"key" + test: 123
}
This code doesn't work. What is wrong with "key" + test ?
With ES6, you can define dynamic keys within an object literal:
const test = "test123"
const test123 = { [`key${test}`]: 123 }; //{ keytest123: 123 }
Because "key" + test
is an expression and not an identifier nor a string literal nor a number literal, which are the only things that are allowed as the key in an object literal.
You have to use the []
notation after creating the object for such a dynamic key:
var test123 = {};
test123["key" + test] = 123;
An identifier is basically the same subset of characters that you can call a variable (letters, numbers, _
and $
; may not start with a number), and a string literal is any string enclosed with '
or "
.
So, the only types of keys you can use in an object literal are:
{
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
}
Reference: http://es5.github.com/#x11.1.5.
PropertyName :
IdentifierName
StringLiteral
NumericLiteral
You can but not with literal notation (pre ES6).
var test123 = {};
test123["foo" + "bar"] = 'baz';
test123.foobar === 'baz'; // true
Javascript provides two ways to define a property of an object:
In this situation, the propertyName is un-editable, and un-computable. you cannot do the following:
object.('property'+'Name')
as you can see
object = {propertyName:value};
object = {'propertyName':value};
they are equal
you can do :
var a = "propertyName";
object[a] = value;
and this time you have to use a string
object[propertyName] = value;//error
object["propertyName"] = value;//correct
object = {'propertyName':value};//correct
object = {propertyName:value};//correct
Your code is equivalent to test123.("key" + test) = 123
which may better help you to understand why it is wrong.
You need ["name"]
notation to be able to access fields by their name in string. Other notations (yours and .
one) require identifiers.
--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"]**