首页 > 解决方案 > Javascript 从 JSON 伪造数据数组并使用 ApexChart 将它们加载到图表中

问题描述

我将尝试用欧元的比特币价值制作图表。数据从 JSON 下载并转换为伪造 Apexchart 系列数据 (ApexData['xbtToEuro']) 和列出日期的数组。我不明白为什么它不起作用。我的控制台说没关系,但在我的图表中,我只有第一个值。

我做错了什么?

截图 ApexChart 不工作

    <HTML>
        <HEAD>
            <TITLE>test</TITLE>
        </HEAD>
        <BODY>
            <script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
            <div id="myChart"></div>
            <script type="text/javascript">

/*  PARTIE AJAX */
var dataApex = [];
var list_date = [];
var catalogue = [];
var series_forged = [];

loadData();


            function loadData() {
                // on vérifie si le catalogue a déjà été chargé pour n'exécuter la requête AJAX
                // qu'une seule fois
                if (catalogue.length === 0) {
                    // on récupère un objet XMLHttpRequest
                    var xhr = new XMLHttpRequest();
                    // on réagit à l'événement onreadystatechange
                    xhr.onreadystatechange = function() {
                        // test du statut de retour de la requête AJAX
                        if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
                            // on désérialise le catalogue et on le sauvegarde dans une variable
                            catalogue = JSON.parse(xhr.responseText);
                                // init sub array
                            Object.keys(catalogue).forEach(function(date_day){
                                Object.keys(catalogue[date_day]).forEach(function(hours){
                                    list_date.push(new Date(hours * 1000));
                                    Object.keys(catalogue[date_day][hours]).forEach(function(monneys){
                                        var value = catalogue[date_day][hours][monneys];
                                            if (dataApex.indexOf(monneys) === -1) {
                                                dataApex[monneys] = new Array();
                                            }
                                    })
                                })
                            });

                            moulinette();
                        }
                    }
                        var d = new Date();
                        var $month = d.getMonth();
                        var $years = d.getFullYear();
                    // la requête AJAX : lecture de data.json
                    xhr.open("GET", "../data/monney_market/" + $years + "_" + ( $month + 1 * 1) + "_monney.json", true);
                    xhr.send();
                } else {
                        // init sub array
                    Object.keys(catalogue).forEach(function(date_day){
                        Object.keys(catalogue[date_day]).forEach(function(hours){
                            list_date.push(new Date(hours * 1000));
                            Object.keys(catalogue[date_day][hours]).forEach(function(monneys){
                                var value = catalogue[date_day][hours][monneys];
                                    if (dataApex.indexOf(monneys) === -1) {
                                        dataApex[monneys] = new Array();
                                    }
                            })
                        })
                    });

                    moulinette();
                }
            }

            /*  FORGE - transform raw JSON in data available by ApexChart   */
            function moulinette () {
                    Object.keys(catalogue).forEach(function(date_day){
                        Object.keys(catalogue[date_day]).forEach(function(hours){
                            Object.keys(catalogue[date_day][hours]).forEach(function(monneys){
                                var value = catalogue[date_day][hours][monneys];
                                    dataApex[monneys].push(value);
                            })
                        })
                    });

                    console.log(dataApex["xbtToEuro"]);
                    console.log(list_date);

                series_forged = new Array;
                series_forged.push({
                    name: "xbtToEuro",
                    data: dataApex["xbtToEuro"], // i push my array forged with data here
                    type: "line"
                });
                loadChart("#myChart");

            }

            function loadChart ($idCSS){
  /* https://apexcharts.com/docs/update-charts-from-json-api-ajax/
    */

              let options = {
                              noData: {
                                        text: 'Loading...'
                                      },
                              series: series_forged, 
                              chart: {
                                      height: 350,
                                      type: 'line',
                                      },
                              stroke: {
                                      width: [0, 4],
                                      curve: 'smooth', /*   smooth|straight|stepline    */
                              },
                              title: {
                                      text: 'Xbt in Euro'
                              },
                              dataLabels: {
                                          enabled: true,
                                          enabledOnSeries: [1]
                              },
                              labels: list_date,
                              xaxis: {
                                    categories: list_date, // i push my array forged with list of time value
                                      type: 'datetime'
                              },
                              yaxis: {
                                        title: {
                                                text: 'euro',
                                        },
                                      }
              };
       
              var chart = new ApexCharts(document.querySelector($idCSS), options);
              chart.render();
            }
            </script>
        </BODY>
    </HTML>

谢谢你的帮助。

标签: javascriptarraysjsoncharts

解决方案


已解决,例如代码已发布。我认为以前代码中的问题来自日期数组。

        <HTML>
            <HEAD>
                <TITLE>test</TITLE>
            </HEAD>
            <BODY>
                <script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
                <div id="myChart"></div>
                <script type="text/javascript">
    
    /*  PARTIE AJAX */
    var dataApex = [];
    var list_date = [];
    var catalogue = [];
    var series_forged = [];
    
    loadData();
    
    
                function loadData() {
                    // on vérifie si le catalogue a déjà été chargé pour n'exécuter la requête AJAX
                    // qu'une seule fois
                    if (catalogue.length === 0) {
                        // on récupère un objet XMLHttpRequest
                        var xhr = new XMLHttpRequest();
                        // on réagit à l'événement onreadystatechange
                        xhr.onreadystatechange = function() {
                            // test du statut de retour de la requête AJAX
                            if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
                                // on désérialise le catalogue et on le sauvegarde dans une variable
                                catalogue = JSON.parse(xhr.responseText);
                                    // init sub array
                                Object.keys(catalogue).forEach(function(date_day){
                                    Object.keys(catalogue[date_day]).forEach(function(hours){
                                        tmpDate = new Date(hours * 1000)
                                        list_date.push(tmpDate.getFullYear() + '-' + ( tmpDate.getMonth() + 1 *1 ) + '-' + tmpDate.getDate() + ' @ ' + tmpDate.getHours() + 'H');
                                        Object.keys(catalogue[date_day][hours]).forEach(function(monneys){
                                            var value = catalogue[date_day][hours][monneys];
                                                if (dataApex.indexOf(monneys) === -1) {
                                                    dataApex[monneys] = new Array();
                                                }
                                        })
                                    })
                                });
    
                                moulinette();
                            }
                        }
                            var d = new Date();
                            var $month = d.getMonth();
                            var $years = d.getFullYear();
                        // la requête AJAX : lecture de data.json
                        xhr.open("GET", "../data/monney_market/" + $years + "_" + ( $month + 1 * 1) + "_monney.json", true);
                        xhr.send();
                    } else {
                            // init sub array
                        Object.keys(catalogue).forEach(function(date_day){
                            Object.keys(catalogue[date_day]).forEach(function(hours){
                                tmpDate = new Date(hours * 1000)
                                list_date.push(tmpDate.getFullYear() + '-' + ( tmpDate.getMonth() + 1 *1 ) + '-' + tmpDate.getDate() + ' @ ' + tmpDate.getHours() + 'H');
                                Object.keys(catalogue[date_day][hours]).forEach(function(monneys){
                                    var value = catalogue[date_day][hours][monneys];
                                        if (dataApex.indexOf(monneys) === -1) {
                                            dataApex[monneys] = new Array();
                                        }
                                })
                            })
                        });
    
                        moulinette();
                    }
                }
    
                /*  FORGE - transform raw JSON in data available by ApexChart   */
                function moulinette () {
                        Object.keys(catalogue).forEach(function(date_day){
                            Object.keys(catalogue[date_day]).forEach(function(hours){
                                Object.keys(catalogue[date_day][hours]).forEach(function(monneys){
                                    var value = catalogue[date_day][hours][monneys];
                                        dataApex[monneys].push(value);
                                })
                            })
                        });
    
                        console.log(dataApex["xbtToEuro"]);
                        console.log(list_date);
    
    
    
                    series_forged = new Array;
                    series_forged.push({
                        name: "xbtToEuro",
                        data: dataApex["xbtToEuro"], // i push my array forged with data here
                        type: "line"
                    });
                    loadChart("myChart");
    
                }
    
              function loadChart ($idCSS){
    /* https://apexcharts.com/docs/update-charts-from-json-api-ajax/
      $idCSS => l'identifiant CSS ou générer le graphique
      */
                let options = {
                                noData: {
                                          text: 'Loading...'
                                        },
                                series: series_forged,
                                chart: {
                                        height: 350,
                                        },
                                stroke: {
                                        width: [3, 6],
                                        curve: 'smooth', /* smooth|straight|stepline  */
                                },
                                title: {
                                        text: 'XBT to Euro'
                                },
                                dataLabels: {
                                            enabled: true,
                                            enabledOnSeries: [1]
                                },
                                labels: list_date,
                                xaxis: {
                                          title: {
                                                  text: 'date',
                                          },
                                        },
                                yaxis: {
                                          title: {
                                                  text: 'euro',
                                          },
                                        }
                };
                document.getElementById($idCSS).innerHTML = " ";
                var chart = new ApexCharts(document.querySelector("#" + $idCSS), options);
                chart.render();
              }
                </script>
            </BODY>
        </HTML>

JSON 示例

{"19":{"1595163207":{"cadToEuro":0.6443298969072164,"hkdToEuro":0.11284516514889918,"iskToEuro":0.006242197253433209,"phpToEuro":0.017695669869582913,"dkkToEuro":0.13431292224624933,"hufToEuro":0.0028270948773040823,"czkToEuro":0.0374784498913125,"audToEuro":0.6112469437652812,"ronToEuro":0.20651769856676716,"sekToEuro":0.09677731539727087,"idrToEuro":5.954702577493011e-5,"inrToEuro":0.01167269756040621,"brlToEuro":0.16436825062870855,"rubToEuro":0.012218829460575335,"hrkToEuro":0.13266118333775537,"jpyToEuro":0.008161266628580756,"thbToEuro":0.02759534190628622,"chfToEuro":0.9299730307821074,"sgdToEuro":0.6294454585510165,"plnToEuro":0.22307984027483435,"bgnToEuro":0.5112997238981491,"tryToEuro":0.12752987387295472,"cnyToEuro":0.12503907471084716,"nokToEuro":0.09434407283362423,"nzdToEuro":0.5726392945083891,"zarToEuro":0.052494540567780947,"euroToUsd":1.1428,"mxnToEuro":0.039042368778598534,"ilsToEuro":0.2547575981453647,"gbpToEuro":1.097959990337952,"krwToEuro":0.000726453815698667,"myrToEuro":0.20524187755269585,"usdToEuro":0.8750437521876093,"rubToUsd":0.013938837551685557,"cnyToUsd":0.14288772082940035,"jpyToUsd":0.00933432303293587,"brlToUsd":0.18758248939971353,"cadToUsd":0.7367025195226168,"chfToUsd":0.5097934534098795,"xbtToEuro":7997.5201,"xbtToUsd":9140.7647,"bchToEuro":194.88,"bchToUsd":222.49,"dashToEuro":60.52,"dashToUsd":69.06,"ethToEuro":205.23,"ethToUsd":234.12,"goldToEuro":50.93,"goldToUsd":58.2},"1595164651":{"cadToEuro":0.6443298969072164,"hkdToEuro":0.11284516514889918,"iskToEuro":0.006242197253433209,"phpToEuro":0.017695669869582913,"dkkToEuro":0.13431292224624933,"hufToEuro":0.0028270948773040823,"czkToEuro":0.0374784498913125,"audToEuro":0.6112469437652812,"ronToEuro":0.20651769856676716,"sekToEuro":0.09677731539727087,"idrToEuro":5.954702577493011e-5,"inrToEuro":0.01167269756040621,"brlToEuro":0.16436825062870855,"rubToEuro":0.012218829460575335,"hrkToEuro":0.13266118333775537,"jpyToEuro":0.008161266628580756,"thbToEuro":0.02759534190628622,"chfToEuro":0.9299730307821074,"sgdToEuro":0.6294454585510165,"plnToEuro":0.22307984027483435,"bgnToEuro":0.5112997238981491,"tryToEuro":0.12752987387295472,"cnyToEuro":0.12503907471084716,"nokToEuro":0.09434407283362423,"nzdToEuro":0.5726392945083891,"zarToEuro":0.052494540567780947,"euroToUsd":1.1428,"mxnToEuro":0.039042368778598534,"ilsToEuro":0.2547575981453647,"gbpToEuro":1.097959990337952,"krwToEuro":0.000726453815698667,"myrToEuro":0.20524187755269585,"usdToEuro":0.8750437521876093,"rubToUsd":0.01391271363806554,"cnyToUsd":0.14301642228973868,"jpyToUsd":0.00934186207973765,"brlToUsd":0.18563862471481268,"cadToUsd":0.7367025195226168,"chfToUsd":0.5097934534098795,"xbtToEuro":7990.2143,"xbtToUsd":9132.4145,"bchToEuro":194.74,"bchToUsd":222.2,"dashToEuro":60.47,"dashToUsd":69.07,"ethToEuro":204.91,"ethToUsd":233.74,"goldToEuro":50.93,"goldToUsd":58.2}},"20":{"1595196001":{"cadToEuro":0.6443298969072164,"hkdToEuro":0.11284516514889918,"iskToEuro":0.006242197253433209,"phpToEuro":0.017695669869582913,"dkkToEuro":0.13431292224624933,"hufToEuro":0.0028270948773040823,"czkToEuro":0.0374784498913125,"audToEuro":0.6112469437652812,"ronToEuro":0.20651769856676716,"sekToEuro":0.09677731539727087,"idrToEuro":5.954702577493011e-5,"inrToEuro":0.01167269756040621,"brlToEuro":0.16436825062870855,"rubToEuro":0.012218829460575335,"hrkToEuro":0.13266118333775537,"jpyToEuro":0.008161266628580756,"thbToEuro":0.02759534190628622,"chfToEuro":0.9299730307821074,"sgdToEuro":0.6294454585510165,"plnToEuro":0.22307984027483435,"bgnToEuro":0.5112997238981491,"tryToEuro":0.12752987387295472,"cnyToEuro":0.12503907471084716,"nokToEuro":0.09434407283362423,"nzdToEuro":0.5726392945083891,"zarToEuro":0.052494540567780947,"euroToUsd":1.1428,"mxnToEuro":0.039042368778598534,"ilsToEuro":0.2547575981453647,"gbpToEuro":1.097959990337952,"krwToEuro":0.000726453815698667,"myrToEuro":0.20524187755269585,"usdToEuro":0.8750437521876093,"rubToUsd":0.01391271363806554,"cnyToUsd":0.14301642228973868,"jpyToUsd":0.00934186207973765,"brlToUsd":0.18563862471481268,"cadToUsd":0.7367025195226168,"chfToUsd":0.5097934534098795,"xbtToEuro":8032.1157,"xbtToUsd":9180.3057,"bchToEuro":198.31,"bchToUsd":226.31,"dashToEuro":60.87,"dashToUsd":69.43,"ethToEuro":206.52,"ethToUsd":235.71,"goldToEuro":50.93,"goldToUsd":58.2}}}

结构 :

  • /your_project/data/monney_market/ => 你的 json 文件在这里
  • /your_project/folder/demo.html

推荐阅读