如何为30天,60天和90天延伸的折线图组合匹配日期的数组?

时间:2018-10-12 23:46:12

标签: javascript arrays date range chart.js

我正在尝试使用chartjs绘制折线图,​​以显示JSON文件中的日期,并且它必须具有以下特征:

  1. X轴必须是30天,60天或90天的16个不同日期(可通过下拉菜单更改)
  2. Y轴显示在每个日期发生的患者遇见次数
  3. 有两个阵列将在图表中显示为线条:一个用于总次数,一个用于与患者的首次相遇(即新患者/首次就诊)

我已经获得了图表,以显示或多或少的总次数和首次遇到的次数,但是日期范围越高,数据越稀疏,这是因为JSON文件中的日期通常介于16个日期值之间。我的主要问题是,如何确保将这些介于中间的碰撞添加到它们在X轴上最接近的匹配?到目前为止,这基本上是我想出的,但是没有用:

创建X轴的函数:

function calcLabels() {
    timeAxis = [];
    timeAxisDates = [];
    if (!isYearView) {
        numberOfGraphValues = 16;
        switch (tabDays) {
            case 30:
                timeInterval = 2;
                break;
            case 60:
                timeInterval = 4;
                break;
            case 90:
                timeInterval = 6;
        }
        let dateForArray = new Date();
        for (let i = 1; i < numberOfGraphValues; i++) { //Find 16 dates spread across the number of months
            timeAxisDates.push(new Date(dateForArray));
            let theDate = dateForArray.getDate();
            if (theDate === 1 || theDate <= timeInterval || i === (numberOfGraphValues-1)) {
                theDate = nameMonth(dateForArray.getMonth()) + ' ' + theDate; //Add the month name if it's the 1st or 2nd day of it
            }
            dateForArray.setDate(dateForArray.getDate() - timeInterval);
            timeAxis.push(theDate)
        }
        timeAxisDates.reverse();
        timeAxis.reverse();
    } else { //Is YTD
        numberOfGraphValues = 12;
        timeAxis = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
        timeAxisDates = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    }
}

应该找出所有相遇并将其分配给日期的有问题的代码:

function countEncounters() {
    resetPatients();
    let patientData = JSON.parse(sessionStorage.getItem('patient_data'));
    let index = 0;
    for (let patient in patientData) {
        if (patient === '00000000') continue;
        //Find the encounter
        let isNewPatient = true;
        for (let encounter in patientData[patient].patientEncounters) {
            let formattedDate = formatDate(patientData[patient].patientEncounters[encounter].encounterDate); //This function simply changes the date form from a JSON string, e.g. "20181012" to a date object
            formattedDate.setHours(0, 0, 0, 0);
            patientEncounters[index] = {"date": formattedDate};
            if (isNewPatient) firstPatientEncounter[index] = {"date": formattedDate};
            isNewPatient = false;
            index++;
        }
    }
    //Find the date on the axis in the graph
    if (!isYearView) {
        for (let i = 0; i < timeAxis.length; i++) {
            for (let date in patientEncounters) {
                let dayAfter = [];
                for (let j=0; j<timeInterval; j++){
                    dayAfter.push(timeAxisDates[i].getDate() + j)
                }
                // dayAfter.setDate(timeAxisDates[i].getDate() + 1);
                if (patientEncounters[date].date.getMonth() === timeAxisDates[i].getMonth()) { //compare months and days
                    if (patientEncounters[date].date.getDate() === timeAxisDates[i].getDate() || checkRange(patientEncounters[date].date.getDate(), dayAfter)) {
                        totalPatients[i]++
                    }
                }
                if (firstPatientEncounter[date] != null) {
                    if (firstPatientEncounter[date].date.getMonth() === timeAxisDates[i].getMonth() ) { //compare months and days
                        if (firstPatientEncounter[date].date.getDate() === timeAxisDates[i].getDate() || checkRange(patientEncounters[date].date.getDate(), dayAfter)) {
                            newPatients[i]++
                        }
                    }
                }
            }
        }
    } else { //YTD
        for (let i = 0; i < 12; i++) {
            for (let date in patientEncounters) {
                if (patientEncounters[date].date.getMonth() === timeAxisDates[i + 1]) {
                    if (lastYear) {
                        if (patientEncounters[date].date.getFullYear() === (year - 1)) {
                            totalPatients[timeAxisDates[i]]++
                        }
                    } else {
                        totalPatients[timeAxisDates[i]]++
                    }
                    if (firstPatientEncounter[date] != null) {
                        if (firstPatientEncounter[date].date.getMonth() === timeAxisDates[i + 1]) {
                            if (lastYear) {
                                if (firstPatientEncounter[date].date.getFullYear() === (year - 1)) {
                                    newPatients[timeAxisDates[i + 1]]++
                                }
                            } else {
                                newPatients[timeAxisDates[i]]++
                            }
                        }
                    }

                }
            }
        }
    }
}

function checkRange(date, array){
for (let i=0; i<array; i++){
    if (date === array[i]) return true
}
return false
}

我还没有完成“年初至今”,但是它也有bug,因此,任何有关如何进行此工作的提示也将不胜感激。不过,在“天”视图中找出我做错的事情可能已经可以解决。

0 个答案:

没有答案