Подтвердить что ты не робот

Использовать конкатенированную (динамическую) строку в качестве объекта JavaScript-объекта?

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

Этот код не работает. Что не так с "ключом" + тестом?

4b9b3361

Ответ 1

Потому что "key" + test - это выражение, а не идентификатор, строковый литерал и литерал числа, которые являются единственными вещами, которые разрешены как ключ в объектном литерале.

Вы должны использовать нотацию [] после создания объекта для такого динамического ключа:

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

Идентификатор - это в основном одно и то же подмножество символов, которое вы можете вызывать переменной (буквы, цифры, _ и $; не может начинаться с числа), а строковый литерал - любая строка, заключенная в ' или ".

Итак, единственными типами ключей, которые вы можете использовать в литературе объекта, являются:

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

Имя свойства:

ИмяИдентификатора

СтроковойЛитерал

ЧисловойЛитерал

Ответ 2

С ES6 вы можете определить динамические ключи внутри литерала объекта:

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

Ответ 3

Вы можете, но не с буквальной нотации (pre ES6).

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

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

Ответ 4

Ваш код эквивалентен test123.("key" + test) = 123, который может помочь вам понять, почему это неправильно.

Вам нужна нотация ["name"] для доступа к полям по их имени в строке. Другие обозначения (ваш и . один) требуют идентификаторов.

Ответ 5

Javascript предоставляет два способа определения свойства объекта:

  • object.propertyName = значение;

В этой ситуации свойствоName не редактируется и не вычисляется. вы не можете сделать следующее:

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