2016-11-22 2 views
-2

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

var fruits = {}; 

var props = ['orange', 'apple', 'banana']; 

for (var i = 0; i < props.length; i++) { 
    fruits.props[i] = 'Juice'; 
} 

Мой объект должен выглядеть следующим образом:

fruits { orange: 'Juice', apple: 'Juice', banana: 'Juice' }; 

Но я получаю сообщение об ошибке:

Uncaught TypeError: Cannot set property '0' of undefined(…)

Что я делаю неправильно?

Edit:

Не потому, что вопрос название похоже, сам вопрос должен быть хорошо. Этот вопрос отличается от 695050, потому что я не извлекаю свои имена свойств из DOM. Я пытаюсь зациклить массив, и он имеет тенденцию вызывать путаницу при работе с нотами скобок.

+0

'фрукты [реквизита [я]] = 'Сок';' – somethinghere

ответ

2

В вашем коде fruits.props[i] = 'Juice'; попытается установить 0-е значение индекса props, где свойство undefined и вызывает ошибку.

Используйте команду bracket notation для назначения свойства объекта с помощью строки.

var fruits = {}; 
 

 
var props = ['orange', 'apple', 'banana']; 
 

 
for (var i = 0; i < props.length; i++) { 
 
    fruits[props[i]] = 'Juice'; 
 
    //----^^^^^^^^^^----- 
 
} 
 

 
console.log(fruits);

2

fruits.props[i] = 'Juice';

должно быть: fruits[props[i]] = 'Juice';

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

+0

Upvoted для обозначения кронштейна объяснения. – Anna

2

Вам нужен ключ в скобках, подробнее о property accessors.

Property accessors provide access to an object's properties by using the dot notation or the bracket notation.

Syntax

object.property 
object["property"] 

var fruits = {}; 
 

 
var props = ['orange', 'apple', 'banana']; 
 

 
for (var i = 0; i < props.length; i++) { 
 
    fruits[props[i]] = 'Juice'; 
 
    // ^ ^
 
} 
 

 
console.log(fruits);

Смежные вопросы