JS сопоставляет строки из разных массивов - PullRequest
0 голосов
/ 30 сентября 2019

Я работаю над проектом firebase с vuejs, пытаясь нарисовать график, который показывает количество подписчиков в месяц. Основная проблема заключается в том, чтобы просто рассчитать количество созданных профилей за каждый месяц. Со всеми остальными шагами все будет в порядке.

Я думал сделать что-то вроде этого:

// calculation of number of users each month
let months = ['jan', 'feb', 'mar', 'apr', 'may', 'Jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];

this.users.filter(user => {
  let print = user.metadata.creationTime;

  for (var month in months) {
    if (print.indexOf(month) > -1) {
      console.log(user.email)
    }
  }
})

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

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

1 Ответ

0 голосов
/ 30 сентября 2019

Я думаю, вы стремитесь к чему-то вроде этого:

// 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...