2017-02-21 36 views
0

Я пытаюсь получить доступ к вложенному объекту javascript в цикле for. Объекты первого уровня отображаются просто отлично, но дети второго уровня отображаются как неопределенные. Однако, если я делаю это за пределами цикла, жестко кодируя доступ к объекту, он работает отлично. Что происходит?Доступ к объекту javascript в цикле for возвращает undefined

Это объект, который я пытаюсь получить доступ к:

var groups = { 
    "group1": { 
    "sum": 25, 
    "count": 5 
    }, 
    "group3": { 
    "sum": 5, 
    "count": 5 
    } 
} 

Посмотрите, что я имею в виду здесь: https://jsfiddle.net/97o1jme2/

+0

Код должен быть размещен ** здесь **. – Pointy

ответ

2

используется for ... in

The for...in выписки перебирает перечислимые свойства объекта в произвольном порядке. Для каждого отдельного свойства могут выполняться операторы.

, который дает вам переменную с ключом объекта, вы выполняете итерацию.

Для этого вам необходимо указать access, а не group["sum"] использовать ключ с groups вместе.

groups[group]["sum"] 
//^^^^^^^^^^^ 

или

groups[group].sum 
//^^^^^^^^^^^ 

var groups = { group1: { sum: 25, count: 5 }, group3: { sum: 5, count: 5 } }, 
 
    group; 
 

 
for (group in groups) { 
 
    console.log("[Loop access] " + group + " - sum: " + groups[group].sum + " - count: " + groups[group].count); 
 
}

+0

Спасибо, что работает как шарм. Я хотел бы понять, почему это происходит. Я бы предположил, что переменная цикла будет иметь тип Object, почему это String? – SoKeT

+0

, потому что вы итератин по клавишам объекта. –

+1

Это 'for..in' является ** bad ** ... Используйте' for..of' вместо ... – KarelG

1

При выполнении console.log(group) в цикле вы увидите, что на каждой итерации переменная group не нужная object но это простая строка - keygroups объект. Затем вы получите доступ к соответствующему объекту через groups[group] внутри цикла.

EDIT

Для того, чтобы быть уверенным, что вы получите должного результата я рекомендую вам выполнить некоторую проверку внутри цикла на каждой итерации

if (groups.hasOwnProperty(group)) { 
    // perform operation 
} 

Согласно документации

Метод hasOwnProperty() возвращает логическое значение, указывающее, имеет ли объект указанное свойство.

+0

Я вижу, но я бы предположил, что переменная цикла будет иметь тип Object, почему это String ? – SoKeT

+0

Поскольку он выполняет итерации по свойствам данного объекта, так оно реализуется. – piotrbienias