2016-10-17 3 views
1

Ich mache ein Balkendiagramm von HighCharts aus JSON-Daten, die der Benutzer generiert. Die JSON wird wie folgt formatiert:Highcharts mit mehreren Serien von JSON Dynamisch

[{"name":"project1","data":[50291,7410,2013,2013,524,201]},{"name":"project2","data":[1776995,758630,25633,4120054,24521,2045]}] 

Da der Benutzer die Projekte wählt, könnte dies JSON-Daten auch von 5 Projekte sein! Ich muss in der Lage sein, dynamisch in meine Highcharts zu laden. Dies ist der Code, den ich jetzt habe.

$(function() { 

    var options = { 
     chart: { 
      renderTo: 'container', 
      type: 'column', 
      options3d: { 
       enabled: true, 
       alpha: 0, 
       beta: 0, 
       depth: 0, 
       viewDistance: 25 
      } 
     }, 
     title: { 
      text: 'Data' 
     }, 
     subtitle: { 
      text: 'Dataset' 
     }, 
     plotOptions: { 
      column: { 
       depth: 0 
      } 
     }, 
     series: [], 
     xAxis: { 
      categories: ['XA', 'XB', 'XC', 'XD', 'XE', 'XF'] 
     }, 

     credits: { 
      enabled: false 
     } 
    }; 
    $.getJSON('/uploads/test.json', function (list) { 
     var newseries = { 
      name: '', 
      data: [] 
     }; 

     $.each(list, function (i, item) { 
      newseries.name = item.name; 
      newseries.data = item.data; 
      options.series.push(newseries); 
     }); 
     var chart = new Highcharts.Chart(options); 


     function showValues() { 
      $('#alpha-value').html(chart.options.chart.options3d.alpha); 
      $('#beta-value').html(chart.options.chart.options3d.beta); 
      $('#depth-value').html(chart.options.chart.options3d.depth); 
     } 

     // Activate the sliders 
     $('#sliders input').on('input change', function() { 
      chart.options.chart.options3d[this.id] = this.value; 
      showValues(); 
      chart.redraw(false); 
     }); 

     showValues(); 
    }); 
}); 

Dies funktioniert, wenn ich nur ein Projekt in meinem Diagramm, aber wenn es mehr das Diagramm überschreibt sich in gewisser Weise sind und zeigt nur das letzte Projekt in der JSON. Könnte mir bitte jemand bei diesem Problem helfen?

+0

Bitte rufen Sie console.log (options.series) vor dieser Zeile: var chart = new Highcharts.Chart (Optionen) und sagen Sie mir, was Sie erhalten haben? –

+0

Ich habe den Code vor der Initialisierung des Diagramms hinzugefügt. In meinem Browser wurde keine Nachricht angezeigt, aber als ich die inspect-Funktion von chrome aktiviert habe, gab es eine Nachricht, die besagt: "[Object, Object, Object]", als ich drei Projekte ausgewählt habe! –

+0

Ich habe versucht: window.alert (console.log (options.series)); und das sagt undefiniert! Obwohl im Diagramm die Werte des letzten JSON-Arrays angezeigt werden. –

Antwort

2

Sie sind die name und data Knoten Ihres newseries Objekt überschrieben wird jedes Mal, wenn Schleife, die sie außerhalb der Schleife auf diese Weise zu erklären.

Ich würde diese drehen:

$.getJSON('/uploads/test.json', function (list) { 
    var newseries = { 
     name: '', 
     data: [] 
    }; 

    $.each(list, function (i, item) { 
     newseries.name = item.name; 
     newseries.data = item.data; 
     options.series.push(newseries); 
    }); 
    var chart = new Highcharts.Chart(options); 

in etwas wie folgt aus:

$.getJSON('/uploads/test.json', function (list) { 
    var newseries; 

    $.each(list, function (i, item) { 
     newseries = {}; 
     newseries.name = item.name; 
     newseries.data = item.data; 
     options.series.push(newseries); 
    }); 
    var chart = new Highcharts.Chart(options); 

Obwohl wirklich, in Ihrem Fall, brauchen Sie gar nicht zu Schleife, weil Ihre Rückkehr JSON ist bereits im richtigen Format für Highcharts.

Sie können so etwas wie

$.getJSON('/uploads/test.json', function (list) { 
    options.series = list; 
    var chart = new Highcharts.Chart(options); 

Stattdessen versuchen (nicht getestet, könnte gezwickt müssen).

+0

Danke! Letzter Vorschlag funktioniert. Sehr sauberer Code :-) –

2

Bitte versuchen Sie dies:

$.each(list, function (i, item) { 
    if(item.name!=undefined){ 
     options.series.push({ 
      name:item.name, 
      data:item.data 
     }); 
    } 
}); 
+0

Es funktioniert! :-D. Eine Sache, es lädt die Projekte, die ausgewählt werden, aber auch eine "Serie 1" ohne Daten? Diese 'Serie 1' ist in meinem JSON nicht definiert. –

+0

Jibriggs Antwort hat mir geholfen! Vielen Dank für Ihre Hilfe! –

+0

Gern geschehen! –

Verwandte Themen