js calcula todas las fechas intermedias hasta la hora de inicio y la hora de finalización, y las convierte en un objeto de matriz de estructura jerárquica para los datos de fecha del encabezado del diagrama de Gantt

Escrito al frente:
primer vistazo a la pantalla de estructura de datos final

time ('2020-10-01', '2021-01-06')
necesita devolver finalmente el siguiente objeto de matriz basado en una fecha de inicio y una fecha de finalización

 [
 	最外层数组里的每个对象代表了某一年的所有数据,有几个对象代表了跨度是几年
    {
    
    
      "year": 2020,  year:表示哪一年的数据
      "mouthArr": [ mouthArr:存放当前年份下的所有月份
        {
    
    
          "yearItem": 2020,
          "mouth": 10,  mouth:表示当前月份---dayArr则存放月份的天
          "dayArr": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
        },
        {
    
    
          "yearItem": 2020,
          "mouth": 11,
          "dayArr": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
        },
        {
    
    
          "yearItem": 2020,
          "mouth": 12,
          "dayArr": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
        }
      ]
    },
    {
    
    
      "year": 2021,
      "mouthArr": [
        {
    
    
          "yearItem": 2021,
          "mouth": 1,
          "dayArr": [1,2,3,4,5,6]
        }
      ]
    }
  ]

Cada objeto de la matriz más externa representa todos los datos de un año determinado. Varios objetos representan el lapso de varios años. El año representa un año determinado. La matriz
mouthArr representa todos los meses del año actual. Los parámetros pasados a partir de 2020-10-01, 2021-01-06 final
luego en 2020 este objeto de mouthArr hay 10 , 11 , 12 meses de datos,
en 2021 este objeto mouthArr solo 1 mes de datos de la matriz
mouthArr cada objeto en el yearItem representa a qué año pertenece el mes actual, la boca representa el mes actual, la matriz
dayArr representa un día incluido en el mes actual, la fecha de finalización es 2021-01-06 luego 2021 objetos dentro de la matriz de boca mouthArr es un objetivo dayArr La cantidad de días es solo de 1 a 6

  // time 类型 是newDate()的 Sun Apr 08 2018 08:00:00 GMT+0800 (中国标准时间) 格式
    function format(time) {
    
    
        let year = time.getFullYear(); //获取年份。
        let mouth = time.getMonth() + 1; //获取月份。
        let day = time.getDate(); //获取天
        return {
    
    
            year,
            mouth,
            day
        }
    }
    
    function time(start, end) {
    
    
        //获取开始时间和结束时间的时间戳
        var startTime = new Date(start).getTime()
        var endTime = new Date(end).getTime()
        var dateArr = [] // 存放区间数据的数组
        var stamp;
        var oneDay = 24 * 60 * 60 * 1000;
        for (stamp = startTime; stamp <= endTime;) {
    
    
            dateArr.push(format(new Date(stamp)))
            stamp += oneDay
        }
        //此时的dateArr 格式为[{year: 2020, mouth: 10, day: 1},{year: 2020, mouth: 10, day: 2},....]  可以在这里打印下看看
        
        var listArr = [] // 存放转换后的数组  把扁平化的数据转换为 层级结构的
        dateArr.forEach((item, index) => {
    
    
            if (index === 0) {
    
    
                listArr.push({
    
    
                    year: item.year,
                    mouthArr: [{
    
    
                        yearItem: item.year,
                        mouth: item.mouth,
                        dayArr: [item.day]
                    }]
                })
            } else {
    
    
                // 不是第一次,就需要两个数组对比如果有一样的就再对比
                //some()函数  用于检测数组中的元素是否满足指定条件.
                // 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测
                var yearFlag = listArr.some((listItem, listIndex) => {
    
    
                    // 如果年份相等,就要循环月份数组
                    if (listItem.year == item.year) {
    
    
                        // 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测
                        var mouthFlag = listItem.mouthArr.some((mouthItem, mouthIndex) => {
    
    
                            // 如果月份相等,就把天push进去,return true
                            if (mouthItem.mouth == item.mouth) {
    
    
                                mouthItem.dayArr.push(item.day)
                                return true;
                            }
                        })
                        //  如果月开关是fasle 就代表月份没有一样的 push就行了
                        if (!mouthFlag) {
    
    
                            listItem.mouthArr.push({
    
    
                                yearItem: item.year,
                                mouth: item.mouth,
                                dayArr: [item.day]
                            })
                        }
                        return true
                    }
                })
                //  如果年开关是fasle 就代表年份没有一样的 push就行了
                if (!yearFlag) {
    
    
                    // 如果年份不相等,年份数组push
                    listArr.push({
    
    
                        year: item.year,
                        mouthArr: [{
    
    
                            yearItem: item.year,
                            mouth: item.mouth,
                            dayArr: [item.day]
                        }]
                    })
                }
            }
        })  
        return listArr
    }
  console.log(time('2020-10-01', '2021-01-06'))

Luego puede concatenar las cadenas de matriz del retorno del bucle for para generar el encabezado del diagrama de Gantt que desee: cortar el gráfico en un proyecto
Cabeza de diagrama de Gantt

qq: 45664741

www.flot.top es un pequeño sitio web personal para aprender nuxt.js, bienvenido a visitar

Supongo que te gusta

Origin blog.csdn.net/weixin_43863505/article/details/109486490
Recomendado
Clasificación