0

我在试图弄清楚如何将正确的数据显示到正确的类别时遇到问题。我的数据是来自 json API 的这种格式:

{
  "name" : "product1",
  "records": "5",
  "month" : "Jan",
},
{
  "name" : "product1",
  "records": "10",
  "month" : "Feb",
},
{
  "name" : "product1",
  "records": "20",
  "month" : "March",
},
{
  "name" : "product2",
  "records": "5",
  "month" : "Feb",
}

数据模型的一个例子。

this.state = {
  barChart: { 
   options: {
      plotOptions: {
        xaxis: {
          categories: []
       }}}
        series: [{name: [], data: []}}

这是我已经花费了几天时间的顶点图表中的 ReactJs 中的状态,我尝试根据字母对其进行排序:数据在图表中显示错误。我正在阅读文档,但不知道该怎么做,或者如何让逻辑正确。类别不能如此重复:[Jan, Feb, March] 并且数据[记录] 在它自己的类别中必须是正确的。

4

1 回答 1

2

以下代码将为每个产品创建一个系列对象。每个产品都有自己的数据数组。其中每个数字依次对应一个月。在该产品的数据集中未使用的月份中添加了一个 0 值。

示例数据集:

let data = [{
  "name" : "product1",
  "records": "5",
  "month" : "Jan",
},
{
  "name" : "product1",
  "records": "10",
  "month" : "Feb",
},
{
  "name" : "product1",
  "records": "20",
  "month" : "Mar",
},
{
  "name" : "product2",
  "records": "5",
  "month" : "Feb",
},
{
  "name" : "product1",
  "records": "5",
  "month" : "May",
},
{
  "name" : "product2",
  "records": "5",
  "month" : "Jun",
}
]

这将创建在数据集中使用的月份数组。没有重复。我们将使用它来映射每个产品在特定月份的相应数据值。

创建类别:

let months = data.map((item) => item.month).filter((item, index, array) => array.indexOf(item) == index)

创建系列:

const productTotals = data.reduce((obj, curr) => {
    if(!obj[curr.name]){
        obj[curr.name] = []
    }

    obj[curr.name][months.indexOf(curr.month)] = parseInt(curr.records)
    return obj
}, {})

const series = Object.entries(productTotals).map(([name, prodArr]) => {
    return {
        name: name,
        data: months.map((month, monthIndex) => {
            if(!prodArr[monthIndex]){
                return 0
            } else {
                return prodArr[monthIndex]
            }

        })
    }

})

然后只需使用新的系列数据和类别更新属性。

this.state = {
  barChart: { 
   options: {
      plotOptions: {
        xaxis: {
          categories: [...months]
       }}}
        series: [...series]}
于 2019-05-24T09:26:57.400 回答