前提・実現したいこと
動画表示サイトを作成しており、サイトにアクセスするたびにアクセスデータを取得しています。
取得したアクセスデータをChart.jsに一週間24時間棒グラフで表現しようと思い、サーバサイドからJSON形式でデータを送信し、実現はできたのですがアクセスデータが大量になった際に何万~何十万以上のループが発生してしまいます。
パフォーマンス的によくないと思うのですが何か最適解ありますでしょうか?
JSON
例 [ { "id": 0, "access_time": "2021-2-16 00:00:00.000" }, { "id": 1, "access_time": "2021-2-16 00:00:00.000" }, { "id": 2, "access_time": "2021-2-16 00:00:00.000" } ]
該当のソースコード
JavaScript
1// Chart.jsのラベルデータ作成 2var label_data = []; 3var base_date = new Date(); 4// 1週間前の日付作成 5base_date.setDate(base_date.getDate() - 6); 6// 1週間分ループ 7for (let index = 0; index < 7; index++) { 8 // 24時間分ループ 9 for (let time_index = 0; time_index <= 23; time_index++) { 10 var time_label = new Date(base_date.getFullYear(), base_date.getMonth(), base_date.getDate(), time_index, 0, 0); 11 label_data.push(time_label); 12 } 13 base_date.setDate(base_date.getDate() + 1); 14}
※以下処理で7日24時間アクセス回数分のループ処理が発生します。
analysisに上記JSONデータが入っています。
JavaScript
1// chartに設定するデータ作成関数 2function createChartData(analysis, label_data){ 3 var data = []; 4 // Chart.jsに表示しているラベル分ループする 5 for (let label_index = 0; label_index < label_data.length - 1; label_index++) { 6 // 比較する最初の時間 7 start_datetime = label_data[label_index]; 8 // 比較する2番目の時間 9 second_datetime = label_data[label_index + 1]; 10 11 // analysisのアクセス時間判定、日時がマッチするとカウント+1 12 var access_count = 0; 13 analysis.forEach(target => { 14 if(start_datetime < new Date(target.access_time) && new Date(target.access_time) <= second_datetime){ 15 access_count = access_count + 1; 16 } 17 }) 18 data.push(access_count); 19 } 20 return data; 21}
JavaScript
1// チャート作成 2function createChart(label_data, data){ 3 var ctx = document.getElementById("chart"); 4 var myBar = new Chart(ctx, { 5 type: 'bar', 6 data: { 7 labels: label_data, 8 datasets: [ 9 { 10 data: data 11 }, 12 ] 13 }, 14 }); 15}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/25 10:39
2021/02/25 10:40
2021/02/25 15:32
2021/02/26 01:04