2016-10-07 2 views
0

Я пытаюсь добавить элементы в ассоциативный массив, но мое ключевое имя не создается должным образом. Мой код выглядит следующим образом:Ключевое имя в ассоциативном массиве

var room_name = $('#room_name').val(); 
var item_name = $('#item_name').val(); 
var item_description = $('#item_description').val(); 
roominventory[room_name] = { item_name : item_description }; 

Что происходит, я получаю

{ 
    "Correct room name": { 
     "item_name": "correct item description" 
    } 
} 

Все работает, кроме item_name. Я хотел бы, чтобы имя ключа было значением item_name, но вместо этого я просто получаю текст item_name.

Любые идеи, что я делаю неправильно?

ответ

4

Вы не можете использовать переменные в ключе объекта с синтаксисом, который вы используете, поскольку они воспринимаются буквально. Вам нужно использовать нотацию в виде кронштейна, поскольку вы находитесь в настройке roominventory. Попробуйте следующее:

var room_name = $('#room_name').val(); 
var item_name = $('#item_name').val(); 
var item_description = $('#item_description').val(); 

var obj = {}; 
obj[item_name] = item_description; 
roominventory[room_name] = obj; 
+0

Спасибо Рори, который работает лакомство. Я не знал, что их буквально взяли. Теперь я вижу, как ваше решение преодолевает эту проблему. Еще раз спасибо Clint – Clint

0

Как указал Рори, вы не можете использовать переменные в ключе. Вы должны использовать object, который держит key and value:

//wrong one 
var roominventory = {}; 
var room_name = "something"; 
var item_name = "something item"; 
var item_description = "something description"; 
roominventory[room_name] = {item_name : item_description}; 
console.log(roominventory); 

//correct way 
var roominventory1 = {}; 
var room_name = "something"; 
var item_name = "something item"; 
var item_description = "something description"; 
var obj = {}; 
obj[item_name] = item_description; 
roominventory1[room_name] = obj; 
console.log(roominventory1); 

https://jsfiddle.net/u2j42wsv/

+0

Если я уже указал на это, зачем добавлять другой идентичный ответ? –

+0

@RoryMcCrossan: Я работал над скрипкой в ​​это время ... без обид на ваш ответ .. если захочет, удалит. – Thalaivar

1

В качестве альтернативы вы можете использовать

roominventory[room_name] = {[item_name] : item_description}; 
+0

Я не знал, что это возможно (и я сначала должен был проверить это, чтобы поверить, что я). Я часто использую вид решения, показанный другими ответами, и до сих пор я думал, что это единственный способ сделать это, но я предпочитаю ваш, гораздо более простой и понятный. Благодаря! – cFreed