Use a concatenated (dynamic) string as JavaScript object key? [duplicate]

試著忘記壹切 提交于 2019-11-26 06:38:50

问题


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

This code doesn\'t work. What is wrong with \"key\" + test ?


回答1:


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




回答2:


With ES6, you can define dynamic keys within an object literal:

const test = "test123"
const test123 = { [`key${test}`]: 123 };  //{ keytest123: 123 }



回答3:


You can but not with literal notation (pre ES6).

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

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



回答4:


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.




回答5:


Javascript provides two ways to define a property of an object:

  1. object.propertyName = value;

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

  1. you can use a variable as the property name with "[]";

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



回答6:


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


来源:https://stackoverflow.com/questions/9708192/use-a-concatenated-dynamic-string-as-javascript-object-key

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!