首页 > 解决方案 > 如果不存在,则将日期插入数组 - 打字稿

问题描述

我有以下数组,其中包含周数组。每周内有一系列天:

  weeks: Array(4)
    0: Array(4)
      days: Array(4)
        0: {name: "Tuesday", sessions: Array(2), date: "2020-09-22T01:00:00.000Z"}
        1: {name: "Wednesday", sessions: Array(2), date: "2020-09-23T01:00:00.000Z"}
        2: {name: "Thursday", sessions: Array(2), date: "2020-09-24T01:00:00.000Z"}
        3: {name: "Friday", sessions: Array(2), date: "2020-09-25T01:00:00.000Z"}
    1: Array(4)
      days: Array(4)
        0: {name: "Monday", sessions: Array(2), date: "2020-09-22T01:00:00.000Z"}
        1: {name: "Tuesday", sessions: Array(2), date: "2020-09-23T01:00:00.000Z"}
        2: {name: "Wednesday", sessions: Array(2), date: "2020-09-24T01:00:00.000Z"}
        3: {name: "Thursday", sessions: Array(2), date: "2020-09-25T01:00:00.000Z"}

但是,像上面这样的一些星期缺少几天,第一个缺少星期一,第二个缺少星期五。如何循环遍历周数数组,检查缺失的日期,如果缺失则添加它们,以及当天的正确日期?

此外,每天还有一个会话数组,其中包含以下数据:

sessions: Array(2)
  0:
    code: "N/A"
    session: "AM"
  0:
    code: "N/A"
    session: "PM"

我将如何将此会话数组(具有这些确切值)添加到我添加的每一天?

这是我到目前为止所拥有的:

for (const week of weeks) 
  {
    let monday = false;

    for (const day of week) 
     {
       if (day.name === 'Monday') 
         {
           monday = true;
         }      
      }
    if (monday === false)
      {
        //ADD DAY HERE
      }
  }

在此先感谢您的帮助

标签: typescript

解决方案


只要我们只是填补空白,它就非常简单。

  1. 设置一天enum( days) 以确保阵列顺序准确

  2. 循环遍历数据

  3. 获取reference现有日期中可用的日期week array(稍后我们将使用它)

  4. 将现有减少week arrayweek object键是day名称,值是现有的week data

  5. 取我们现有的enum仅获numerical取值,按值排序,numerical然后执行以下操作

    1. 获取对应daynumerical
    2. 检查是否day存在于我们的week object
    3. 如果是,则返回现有的week object
    4. 否则,创建一个week object
  6. 创建一个week object

    1. 我们已经有了对应的day,用它作为name
    2. 我们sessions可以创建
    3. date是棘手的部分
  7. 建立date

    1. 检查当前day索引是否大于或小于我们的reference index
    2. 如果小于,我们想date使用 our创建一个新的reference date,然后通过我们当前day索引和我们的reference index. 例如
    // Tuesday < Thursday
    1 < 3 // true
    3 - 1 // 2
    // We know that we need to shift our reference date(Thursday) 2 days back to get Tuesday's date
    
    1. 如果大于,则反向应用相同的策略

// Input Data
const weeks = [
  [{
      name: "Tuesday",
      sessions: [{
          code: "N/A",
          session: "AM"
        },
        {
          code: "N/A",
          session: "PM"
        }
      ],
      date: "2020-09-22T01:00:00.000Z"
    },
    {
      name: "Wednesday",
      sessions: [{
          code: "N/A",
          session: "AM"
        },
        {
          code: "N/A",
          session: "PM"
        }
      ],
      date: "2020-09-23T01:00:00.000Z"
    },
    {
      name: "Thursday",
      sessions: [{
          code: "N/A",
          session: "AM"
        },
        {
          code: "N/A",
          session: "PM"
        }
      ],
      date: "2020-09-24T01:00:00.000Z"
    },
    {
      name: "Friday",
      sessions: [{
          code: "N/A",
          session: "AM"
        },
        {
          code: "N/A",
          session: "PM"
        }
      ],
      date: "2020-09-25T01:00:00.000Z"
    }
  ],
  [{
      name: "Monday",
      sessions: [{
          code: "N/A",
          session: "AM"
        },
        {
          code: "N/A",
          session: "PM"
        }
      ],
      date: "2020-09-22T01:00:00.000Z"
    },
    {
      name: "Tuesday",
      sessions: [{
          code: "N/A",
          session: "AM"
        },
        {
          code: "N/A",
          session: "PM"
        }
      ],
      date: "2020-09-23T01:00:00.000Z"
    },
    {
      name: "Wednesday",
      sessions: [{
          code: "N/A",
          session: "AM"
        },
        {
          code: "N/A",
          session: "PM"
        }
      ],
      date: "2020-09-24T01:00:00.000Z"
    },
    {
      name: "Thursday",
      sessions: [{
          code: "N/A",
          session: "AM"
        },
        {
          code: "N/A",
          session: "PM"
        }
      ],
      date: "2020-09-25T01:00:00.000Z"
    }
  ]
];

//  Actual Code

const days = {
  0: "Monday",
  1: "Tuesday",
  2: "Wednesday",
  3: "Thursday",
  4: "Friday",
  Monday: 0,
  Tuesday: 1,
  Wednesday: 2,
  Thursday: 3,
  Friday: 4
};

function handleWeek(week) {
  const referenceDate = new Date(week[0].date),
    referenceIndex = days[week[0].name];
  const weekObject = week.reduce((acc, cv) => (Object.assign(Object.assign({}, acc), {
    [cv.name]: cv
  })), {});
  return Object.keys(days)
    .filter(key => !isNaN(+key))
    .sort()
    .map((dayIndex, index) => {
      const day = days[dayIndex];
      return weekObject[day] ?
        weekObject[day] : {
          name: day,
          sessions: [{
              code: "N/A",
              session: "AM"
            },
            {
              code: "N/A",
              session: "PM"
            }
          ],
          date: referenceIndex < index ?
            new Date(new Date(referenceDate).setDate(referenceDate.getDate() + (index - referenceIndex))).toISOString() : new Date(new Date(referenceDate).setDate(referenceDate.getDate() - (referenceIndex - index))).toISOString()
        };
    });
}
const result = weeks.map(week => handleWeek(week));
console.log(result);


推荐阅读