如何转换对象数组DataTable可识别Highcharts识别的内容?

时间:2015-10-14 13:50:30

标签: javascript jquery loops highcharts datatables

我正在尝试在我的页面上同时使用jquery插件DataTables和highcharts.js显示相同的数据集。因此,当我更改数据时,表格和图表也会发生变化。我的数据是这样的:

series: [
  {
    index: 0,
    name: "Jan",
    data: [
      [data[0]["itemName"], parseFloat(data[0]["Jan"])],
      [data[1]["itemName"], parseFloat(data[1]["Jan"])],
      [data[2]["itemName"], parseFloat(data[2]["Jan"])],
    ]
  },
  {
    index: 1,
    name: "Feb",
    data: [
      [data[0]["itemName"], parseFloat(data[0]["Feb"])],
      [data[1]["itemName"], parseFloat(data[1]["Feb"])],
      [data[2]["itemName"], parseFloat(data[2]["Feb"])],
    ]
  },
  {
    index: 1,
    name: "Mar",
    data: [
      [data[0]["itemName"], parseFloat(data[0]["Mar"])],
      [data[1]["itemName"], parseFloat(data[1]["Mar"])],
      [data[2]["itemName"], parseFloat(data[2]["Mar"])],
    ]
  }
]};

我可以使用DataTables但是尽管工作了几天我无法将其转换为Highcharts接受的格式。到目前为止,我可以使用以下数据集显示高图:

def open_file(self):
    """
    Function in charge of opening a chosen file with a
    filedialog
    """
    filename = filedialog.askopenfilename()
    base = os.path.basename(filename)
    name = base.replace(".csv", "")
    if not base.endswith('.csv'):
        print('Wrong archive')
    else:
        a = AnimalData()
        td=a.load_data(filename)
        global glob
        glob +=1
        tv.append(a.to_tabbed_string(order[name]-1))


class SelectionBox(tk.Listbox):
    def __init__(self, master):
        super().__init__(master, bg='white',relief = tk.RAISED
        if glob == 1:
           self.insert(0, tv[glob-1])

有人可以给我一个oneliner for循环来将第一组(基于itemName)转换为另一个(基于Months),由Highcharts接受。我有数据页面。上述解决方案无法管理。

请参阅jsfiddle here

我希望我可以标记两个答案。两者都解决了我的问题,我不知道哪个在技术上更好。感谢您的快速回答。

2 个答案:

答案 0 :(得分:2)

  

<强>解

您可以使用以下功能过滤掉数据:

function filterData(data, key){
   var result = []; 
   $.each(data, function(index, rcd){       
       result.push([rcd['itemName'], parseFloat(rcd[key])]);
   });
   return result;
}

然后对于HighCharts代码,你可以写:

{
   index: 0,
   name: "Jan",
   data: filterData(data, "Jan")
}
  

<强>样本

请参阅this jsFiddle以获取代码和演示。

答案 1 :(得分:0)

这会将基于名称的逻辑更改为基于月份:

&#13;
&#13;
var data = [
{"itemName": "item1", "Jan": "4056479", "Feb": "3716377", "Mar": "6924148"},
{"itemName": "item2", "Jan": "3034448", "Feb": "930077", "Mar": "1210250"},
{"itemName": "item3", "Jan": "3938924", "Feb": "1624727", "Mar": "9626947"}
  ];

var months = ["Jan","Feb","Mar"] //and so on....
var series = [];
$.each(months,function(i,v){
    var currentData = [];
    $.each(data,function(k,l){
	    currentData.push([l.itemName,parseFloat(l[v])]);
    });
    series.push({index: i, name: v, data: currentData})
});
   
console.log(series);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

这是你的小提琴编辑:fiddle