Проблема приложения календаря: Как создать массив, представляющий каждый день месяца, и связать определенное действие с каким-то днем?

#javascript #arrays #function #data-structures #calendar

Вопрос:

Я работаю над личным проектом, и я сталкиваюсь, я бы сказал, с «Проблемой структуры данных», если выразить это несколькими словами. Идея состоит в том, чтобы создать календарь, в котором отображаются дни месяца и действия, выполняемые пользователями в определенный день.

Структура пользовательских данных выглядит примерно так:

    const userData = [ 
      { "id": "user1",
        "calendar": [
           {day: moment({ M: 2, d: 8 }).format("D, M, YYYY"), activity: "WorkOut" }, {}, {}, {}] }, 
      {Other user}, {Other user}
]
 

Это массив объектов пользователя, но важной частью пользователя является «календарь», который содержит объекты с надписью «В этот конкретный день у меня есть эта деятельность».

Я создаю функцию, которая использует эти две вещи в качестве ссылки:

-Данные одного пользователя

-Массив, содержащий один объект момента для каждого дня месяца

 let monthDates = new Array(dateObject.daysInMonth())
                     .fill(null) 
                     .map((x, i) => moment(dateObject).startOf('month').add(i, 'days'));

let createObjectOfDatesArray = (data) => {
    monthDates.map(day => {
      if (data.length > 0) {
        data.map(item => {
          if (day.format("D, M, YYYY") === item.day) {
            let day = item.day
            let activity = item.activity
            datesObjectsArray.push(new Object({ day, activity }))
          }
        })
      }
      let dayFormated = day.format("D")
      datesObjectsArray.push(new Object({ day: dayFormated }))
    })
  }
  createObjectOfDatesArray(userData[0].calendar)
 

Что должна делать эта функция?
Он повторяет каждый объект момента месяца (каждый элемент даты месяца). В случае, если у него есть (данные), он повторяет эти данные еще раз, и в случае, если день, назначенный пользователем его календарю, совпадает с днем, когда он был повторен; он создает объект с днем и активностью ({day: "", activity: ""}) для хранения в массиве (datesObjectsArray).

В случае, если этого не произойдет, просто сохраните объект, содержащий ({day: ""}) в своем массиве только день (datesObjectsArray).

The idea is that this array represents in the screen a calendar, with each day of the month. In case that the user has an activity in an specific day it should shows too.

The problem: the problem appears when, in the iteration of each day of the month, it also iterates through the array of the user data.

Вопрос: какова была бы логика создания функции, которая возвращает массив с каждым днем, и в случае, если к определенному дню прикреплена какая-либо активность, ее следует переместить в массив? Что-то вроде этого:

 const datesObjectsArray = [ { day: “1”}, // The user doesn't have an activity this day
  { day: “2”}, //The user doesn't have an activity this day
  { day: “2”, actividad “WorkOut” } ]  //The user has an activity this day