【问题标题】:Use a concatenated (dynamic) string as JavaScript object key? [duplicate]使用串联(动态)字符串作为 JavaScript 对象键? [复制]
【发布时间】:2012-03-14 18:45:56
【问题描述】:
var test = "test123"
var test123 ={
    "key" + test: 123
}

此代码不起作用。 “关键”+测试有什么问题?

【问题讨论】:

标签: javascript syntax object-literal


【解决方案1】:

因为"key" + test 是一个表达式,而不是标识符、字符串文字或数字文字,它们是唯一允许作为对象文字中的键的东西。

在为这样的动态键创建对象后,您必须使用[] 表示法:

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

标识符基本上是可以调用变量的字符子集(字母、数字、_ 和 $;可能不以数字开头),字符串文字是用 @987654327 括起来的任何字符串@ 或"。

因此,您可以在对象字面量中使用的唯一类型的键是:

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

参考:http://es5.github.com/#x11.1.5。

属性名称:

标识符名称

字符串字面量

数字字面量

【讨论】:

  • 此外,在对象字面量中也允许使用数字,例如0 或5e10(但不是-10,因为- 不是数字字面量的一部分,而是一元的一部分- 运营商)。
  • @Felix Kling:确实如此,谢谢。
【解决方案2】:

使用 ES6,您可以在对象字面量中定义动态键:

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

【讨论】:

  • 这个。可与展开运算符一起使用
【解决方案3】:

您可以,但不能使用文字符号(ES6 之前)。

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

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

【讨论】:

  • 感谢您的简单回答,这正是我想要的 :)
【解决方案4】:

您的代码等同于test123.("key" + test) = 123,它可以更好地帮助您理解错误的原因。

您需要["name"] 表示法才能通过字符串中的字段名称访问字段。其他符号(您的和 . 之一)需要标识符。

【讨论】:

    【解决方案5】:

    Javascript 提供了两种定义对象属性的方法:

    1. object.propertyName = 值;

    在这种情况下,propertyName 是不可编辑和不可计算的。您不能执行以下操作:

        object.('property'+'Name')
    

    如你所见

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

    他们是平等的

    1. 您可以使用带有“[]”的变量作为属性名称;

    你可以这样做:

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

    这次你必须使用字符串

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

      【讨论】:

      • 请解释您的回答,以帮助网站的其他用户。纯代码答案不是很有用,并且往往被标记为低质量并可能被删除。
      • 感谢您的建议,我提供了我的答案的解释...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      相关资源
      最近更新 更多