Search code examples
javascriptjsonapexcharts

Looping through data and passing it to a chart


I have an array of data that I'm using to plot a Line Chart. I'm using ApexCharts.

let testData = [
  {
    cell_id: 5833307,
    datetime: ["2019-05-07 11:28:16.406795+03", "2019-05-07 11:28:38.764628+03", "2019-05-07 12:18:38.21369+03", "2019-05-07 12:33:47.889552+03", "2019-05-08 08:45:51.154047+03"],
    rsrq: ["108", "108", "108", "108", "109"]
  },
  {
    cell_id: 2656007,
    datetime: ["2019-07-23 15:29:16.572813+03", "2019-07-23 15:29:16.71938+03", "2019-07-23 15:29:16.781606+03", "2019-07-23 15:29:50.375931+03", "2019-07-23 15:30:01.902013+03"],
    rsrq: ["120", "119", "116", "134", "114"]
  }
];

let datasetValue = [];

for( let x=0; x<testData.length; x++ )
{
  datasetValue =
    { 
    chart: {
      height: 380,
      width: "100%",
      type: "line"
    },
    stroke: {
      curve: 'smooth',
      width: 1.5,
    },
    markers: {
      size: 4,
    },
    legend: {
      show: true,
      position: 'top'
    },  
    series: [
      {
        name: testData[x].cell_id,
        data: testData[x].rsrq
      }
    ],
    xaxis: {
      categories: testData[x].datetime,
      title: {
        text: "Date"
      }
    },
    yaxis: {
      title: {
        text: "RSSI"
      }
    }
  }                
}
            
var chart = new ApexCharts(document.querySelector("#signal"), datasetValue);

chart.render();
<div id="signal"></div>
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>

So I take my JSON array, loop it in a for loop to obtain my datasets. I define an array variable datasetValue which i assign the looped data and pass it to my chart instance: new ApexCharts(document.querySelector("#rssi-signal"), datasetValue);

What is happening is only the last array object is being passed meaning there's something I'm missing/not passing to get all my data.


Solution

  • Restructure the testData by grouping series and categories

    let series = [];
    let categories = [];
    
    for (let x = 0; x < testData.length; x++) {
      series.push({
        name: testData[x].cell_id,
        data: testData[x].rsrq
      });
      categories.concat(testData[x].datetime);
    }
    

    let testData = [{
        cell_id: 5833307,
        datetime: ["2019-05-07 11:28:16.406795+03", "2019-05-07 11:28:38.764628+03", "2019-05-07 12:18:38.21369+03", "2019-05-07 12:33:47.889552+03", "2019-05-08 08:45:51.154047+03"],
        rsrq: ["108", "108", "108", "108", "109"]
      },
      {
        cell_id: 2656007,
        datetime: ["2019-07-23 15:29:16.572813+03", "2019-07-23 15:29:16.71938+03", "2019-07-23 15:29:16.781606+03", "2019-07-23 15:29:50.375931+03", "2019-07-23 15:30:01.902013+03"],
        rsrq: ["120", "119", "116", "134", "114"]
      }
    ];
    
    let series = [];
    let categories = [];
    
    
    for (let x = 0; x < testData.length; x++) {
      series.push({
        name: testData[x].cell_id,
        data: testData[x].rsrq
      });
      categories = categories.concat(testData[x].datetime);
    }
    
    var chart = new ApexCharts(document.querySelector("#signal"), {
      chart: {
        height: 380,
        width: "100%",
        type: "line"
      },
      stroke: {
        curve: 'smooth',
        width: 1.5,
      },
      markers: {
        size: 4,
      },
      legend: {
        show: true,
        position: 'top'
      },
      series: series,
      xaxis: {
        categories: categories,
        title: {
          text: "Date"
        }
      },
      yaxis: {
        title: {
          text: "RSSI"
        }
      }
    });
    
    chart.render();
    <div id="signal"></div>
    <script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>