Я думаю, вы стремитесь к чему-то вроде этого:
// Mock data
const users = [
{ metadata: { creationTime: '3 apr' } },
{ metadata: { creationTime: '7 apr' } },
{ metadata: { creationTime: '26 jan' } },
{ metadata: { creationTime: '4 feb' } },
{ metadata: { creationTime: '9 dec' } },
{ metadata: { creationTime: '25 dec' } },
{ metadata: { creationTime: '9 apr' } }
]
// Months in lower-case... creationTime is assumed to also use lower-case
const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
// Use `map` to create an array the same length as `months`
const counts = months.map(month => {
let count = 0
// Loop over the `users` array, note the use of `of`, not `in`
for (const user of users) {
// Using `includes` is somewhat crude but may work depending on how
// creationTime is formatted. It's no worse than indexOf
if (user.metadata.creationTime.includes(month)) {
++count
}
}
return count
})
console.log('Counts: ' + counts.join(' '))
Выходные данные в этом случае - это массив, содержащий счетчики для каждого месяца, но вы можете легко адаптировать возвращаемое значение внутри функции map
, чтобы возвращать объект с месяцемНазовите и посчитайте, если с этим было бы легче работать.
Как я заметил в комментариях, основным недостатком вашего исходного кода является использование for (var month in months) {
. Это будет повторять числовые индексы, а не названия месяцев, поэтому вы просто проверяете 0, 1, 2, etc.
вместо jan, feb, mar, etc.
. Чтобы перебрать содержимое массива, вам нужно использовать цикл for
/ of
.