2016-02-04 2 views
1

Когда я использую для в цикле, она работает, и для петли просто ничего :( не получаю Вот мой коддля включения цикла не работает?

'use strict' 

var match_table = [ 
    {'project': 'Laveral', 'template': 'Blade'}, 
    {'project': 'Ember.js', 'template': 'Handlebars'}, 
    {'project': 'Meteor', 'template': 'Handlebars'}, 
]; 

// count project number by template 
var templateMap = new Array(); 
match_table.forEach(function(listItem){ 
    var template = listItem['template']; 
    if (!templateMap[template]) { 
    templateMap[template] = new Object(); 
    } 
    templateMap[template]['name'] = template; 
    if (templateMap[template]['count']) { 
    templateMap[template]['count']++; 
    } else { 
    templateMap[template]['count'] = 1; 
    } 
}); 

//console.log(templateMap); 

// for loop fails 
for (let value of templateMap) { 
    console.log(value); 
} 

templateMap.forEach(function(item) { 
    console.log(item); 
}) 

также Foreach ничего не выводит либо ~ ?!

ответ

4

for-of не перебирать объектов (так как они не являются итерацию по стандарту).

Таким образом, вы должны либо использовать старый добрый for-in

ИЛИ

Используйте нестандартизированного еще Object.entries():

for (const [key, value] of Object.entries(obj)) { 
    console.log(key, value); 
} 

templateMap в вашем случае является объектом, а не массив, так как вы назначаете строковые ключи в него (и JS массивы индексов являются числовыми в [0; 2^32-1) диапазоне).

+1

Меня интересовало, насколько велики накладные расходы 'Object.entries()': http://jsperf.com/object-entries-4711. Это далеко не пренебрежимо. Это переименование 'iteritems()' vs 'item()' в Python. – kay

+0

@Kay выделяет кучи массивов, но интересно, спасибо. – zerkms

+0

@Kay Вы должны добавить хотя бы проверку hasOwnProperty. – Ginden

1

template numeric? Похоже, вы собираетесь злоупотреблять Массив как объект. Попробуйте templateMap.push(new Object()), чтобы добавить к массиву.

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

  • Нет связанных вопросов^_^