Создание имени переменной свойства в объекте JSON

Я запускаю этот код.

var output = {"records": []};
for(i = 0; i < data.length; i++)
  output.records[i] = { propertyName : data[i][propertyName] }

Я ожидал, что вывод будет в следующей форме.

{ "cat" : "mjau" }
{ "dog" : "woff" }

Вместо этого я получаю к моему удивлению это.

{ "propertyName" : "mjau" }
{ "propertyName" : "woff" }

Как я могу получить переменную propertyName?

Я пытаюсь создать синтаксический анализатор, который будет создавать ряд записей, все из которых являются cat, но при вызове из другого места записи должны вместо этого иметь свойство dog. Я хочу избежать создания для этого двух разных фрагментов кода.

Я нашел этот вопрос, который я подозреваю содержит ответ на мой вопрос. Но по незнанию не понимаю.


person Community    schedule 10.12.2012    source источник
comment
куда вы делите кошку и собаку?? я имею в виду, где вы держите эти свойства?   -  person Bhushan Firake    schedule 11.12.2012
comment
возможный дубликат создания объекта json с переменными   -  person jbabey    schedule 11.12.2012
comment
@jbabey Поздравляю! В своем вопросе я упомянул, что нашел тот самый вопрос. Я также объяснил, что из-за отсутствия навыков я этого не понимаю. Какой смысл упоминать об этом снова? Кроме того, ответы, которые я получил здесь, очень ясны и действительно полезны, поэтому точная копия не является. :)   -  person    schedule 11.12.2012
comment
@BhushanFirake Я не понимаю, что вы имеете в виду. Это лишь некоторые имена свойств, с которыми я буду работать.   -  person    schedule 11.12.2012


Ответы (4)


Ключи в литералах объектов не будут оцениваться в JavaScript. Итак, вам нужно создать пустой объект ({}), а затем динамически назначить ключ:

output.records[i] = {};
output.records[i][propertyName] = data[i][propertyName]
person Wyatt Anderson    schedule 10.12.2012

var a = {b:'c'}

так же, как

var a = {};
a['b'] = 'c';

То, что вы хотите, это

a[b] = c

то есть

output.records[i] = {};
output.records[i][propertyName] = data[i][propertyName];

В этом документе MDN вы найдете: Работа с объектами.

person Denys Séguret    schedule 10.12.2012

В { propertyName : data[i][propertyName] } часть имени свойства должна быть постоянной строкой. Если вы передаете переменную, она не получит свое значение.

Что вам нужно сделать, это

for(i = 0; i < data.length; i++){
  var a = {};
  a[propertyName] = data[i][propertyName];
  output.records.push(a);
}
person Shiplu Mokaddim    schedule 10.12.2012

Вы можете попробовать это:

'"' + propertyName + '"' : ...
person orolo    schedule 10.12.2012
comment
Я заметил, что ваш подход отличается от большинства других. Это то же самое, выраженное другим синтаксисом, или это другой метод? Если да, то что предпочтительнее в данном случае? - person ; 11.12.2012
comment
Нет. Я неправильно понял. Все, что я делаю в приведенном выше примере, заключаю строку в кавычки. OP, вероятно, получит что-то вроде propertyName. - person orolo; 11.12.2012