Задача №6

Дано інформацію про відвідувачів деякого сайту (для кожного відвідувача зберігається логін). Підрахувати для кожного клієнта кількість відвідувань.


Рішення:

'use strict'

class Visitor {
  /**
   * @param {Visitor[]} visitorList
   * @returns {Map<Visitor, number>}
   */
  static getVisits(visitorList) {
    const visitCounter = new Map()

    for (const visitor of visitorList) {
      visitCounter.set(visitor, (visitCounter.get(visitor) ?? 0) + 1)
    }

    return visitCounter
  }

  /**
   * @param {string} login
   * @param {Date} registrationDate
   */
  constructor(login, registrationDate) {
    this.login = login
    this.registrationDate = registrationDate
  }

  /** @param {'string'|'number'|'default'} hint */
  [Symbol.toPrimitive](hint) {
    return hint === 'string'
      ? `відвідувач ${this.login}, час візиту: ${this.registrationDate.toLocaleDateString('uk-UA')}`
      : this.registrationDate.getTime()
  }
}

// =============================================================================

const visitorList = [
  new Visitor('ivan23', new Date('2024-12-01')),
  new Visitor('oksana_l', new Date('2025-01-15')),
  new Visitor('admin', new Date('2025-05-01')),
  new Visitor('tester007', new Date('2025-04-30')),
  new Visitor('guest42', new Date('2025-03-17')),
  new Visitor('marta_k', new Date('2024-11-25')),
  new Visitor('user101', new Date('2025-02-10')),
  new Visitor('oleksii_dev', new Date('2025-05-05')),
  new Visitor('natalka88', new Date('2024-10-19')),
  new Visitor('bot42', new Date('2025-01-01')),
]

const visitList = visitorList
  .toSorted(() => Math.random() - 0.5)
  .slice(2, -2)
  .concat(visitorList.toSorted(() => Math.random() - 0.5).slice(3, -3))
const visitCounter = Visitor.getVisits(visitList)

console.log('%cКількість відвідувань', 'font-size: 1.25rem;')
for (const [{login}, visits] of visitCounter) {
  console.log(`${login} - ${visits}`)
}