Эффективный способ форматирования запрошенного списка элементов в данные диаграммы. js - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь настроить многополосную гистограмму с данными, поступающими из запроса. На многополосной диаграмме я пытаюсь показать среднее время для разных компаний по нескольким statusID (т.е. компании 1-15 будут показывать средние значения времени для всех statusID 1-10.

Чтобы выполнить sh это раньше я сначала создавал массивы с длиной всех отдельных идентификаторов статуса, а затем добавлял данные из запроса в зависимости от компании и statusID (со значениями «0» для среднего времени, если statusID для этой компании не имел значений). Когда я использовал этот метод, я добавил данные для диаграммы js следующим образом:


var sDeliverySupports = @Html.Raw(Json.Encode(ViewBag.ServiceDeliverySupports)); //Ordered list of company names
var sDeliveryTimes = @Html.Raw(Json.Encode(ViewBag.ServiceDeliveryTimes)); //Ordered list of arrays containing the average times for each company for all statusIDs

    try {
        //bar chart
        var ctx = document.getElementById("serviceReport");
        if (ctx) {
            ctx.height = 75;

            var myData = []; //array to hold the 
            var x = Math.random.next
            sDeliverySupports.forEach(function (a, i) {
                myData.push(
                   {
                       label: sDeliverySupports[i], //the name of the company
                       data: sDeliveryTimes[i], //the array at index i of the sDeliveryTimes list
                       borderColor: "rgba(255, 255, 255, 0.9)",
                       borderWidth: "0",
                       backgroundColor: "rgba(0, 123, 255, 0.9)",
                       fontFamily: "Poppins"
                   }
                )
            });


            var myChart = new Chart(ctx, {
                type: 'bar',
                defaultFontFamily: 'Poppins',
                data: {
                    labels: @Html.Raw(Json.Encode(ViewBag.TicketStatuses)), //list of the statusIDs
                    datasets: myData
                },
                .
                .
                .

Бэкэнд для этого был примерно таким:

List<companyName, int[# of statuses] avgTimes> timeList; //result
for every company
{
   for every status
   {
      if data for the status exists
          get the times for this status and add the avg to avgTimes[StatusID]
      else
          add a 0 value in
   }
   add companyName + the array of times to timeList;
}
//And then I split the result into Viewbags to feed into the chart data
ViewBag.ServiceDeliverySupports = select the company names
ViewBag.ServiceDeliveryTimes = select array of company times

Это сработало. потому что даже если в моем запросе не было значений для определенного идентификатора статуса, я все равно добавил его в массив, чтобы значение соответствовало правильному статусу на диаграмме. Поскольку это было слишком неэффективно, я теперь работаю с представление, в котором есть все данные, и я сгруппировал его по полю компании и полю statusID, поэтому у меня есть список всех времен для каждой компании и для statusID, bu t не каждый statusID имеет данные для него, поэтому моя проблема в том, что мне нужно найти более эффективный способ добавить 0 значений для statusID без данных для каждой компании, чтобы я мог ввести этот список в гистограмму или другой способ подойти к этой проблеме.

var statusTimes = qry.GroupBy(g => new { g.VendorName, g.LogStatus }).Select(g =>
             new VendorAvgStatusTime { VendorName = g.Key.VendorName, Status = g.Key.LogStatus, AvgTime = g.Average(a => a.LogTime) }).OrderBy(x => x.VendorName).ThenBy(x => x.Status);

Сообщите мне, если что-то нужно прояснить. Я много пытался искать решения в Интернете, но мне кажется, что трудно объяснить проблему несколькими словами. Я пытался избежать внутренних циклов for, потому что мне казалось, что именно поэтому мой исходный код выполнялся так долго.

...