【问题标题】:How to generate dynamic series data for highcharts?如何为 highcharts 生成动态系列数据?
【发布时间】:2020-09-03 13:13:27
【问题描述】:

我在我的项目中使用 angular-highcharts。我使用https://www.highcharts.com/demo/column-basic 这个图表作为我的数据。我有以下数据格式。

[
    {
        "project": "train project1",
        "hours": {
            "AD": 58265
        }
    },
    {
        "project": "butify",
        "hours": {
            "AD": 3940
        }
    },
    {
        "project": "skler",
        "hours": {
            "AD": 563250
        }
    },
    {
        "project": "Internal Application",
        "hours": {
            "AD": 33325,
            "DAM": 328095
        }
    },
    {
        "project": "train2project",
        "hours": {
            "AD": 137215
        }
    },
    {
        "project": "CELLProje1",
        "hours": {
            "DAM": 488470
        }
    },
    {
        "project": "rangeselector",
        "hours": {
            "AD": 3015,
            "DAM": 71175
        }
    },
    {
        "project": "Android dev",
        "hours": {
            "AD": 99160
        }
    },
    {
        "project": "Web Application",
        "hours": {
            "AD": 72720
        }
    }
];

“小时”内的值将是一个或多个。到目前为止,我已经添加了我的小提琴。我努力为 系列数据形成 json。此外,我需要表格 X 轴作为图表那应该在一个数组中。 例如:

categories: [
            'train project1',
            'beautify',
            'skler',
            'Internal Application',
            'train project2',
            'rangeselector',
            'Android',
            'Web Application'

        ],

X轴编队会不会吧?

http://jsfiddle.net/harifrais/uxpvs8fw/34/

【问题讨论】:

  • 你能显示你想要的系列数据格式吗?
  • 添加了我的示例图表---column-basic..检查开头的链接
  • 我想我可以看到你想要做什么......但是会有一个很大的问题......你需要填写0的记录没有'不存在以便您的类别正确排列。您是否有所有键的单独列表(在此示例中为ADDAM)?
  • 我没有单独的列表。这就是我遇到的问题......
  • 正在更新答案...给我 5

标签: javascript json highcharts


【解决方案1】:

您正在尝试将数据转换为这种格式

[ 
    {
       name:"series-name",
       data:[ ... ]
    }
]

但要使用类别,每个系列中的元素数量必须与类别数量相同。由于输入数据中的每个 hours 元素并不包含所有相同的元素,因此您需要做更多的工作。

  1. hours 获取所有键的不同列表
  2. 循环遍历每个元素并使用 project 作为类别
  3. hours 中没有出现任何元素的地方填零

因此,您可以使用reducemap 在相当简单的两步过程中完成此操作。

var data = [{"project":"train project1","hours":{"AD":58265}},{"project":"butify","hours":{"AD":3940}},{"project":"skler","hours":{"AD":563250}},{"project":"Internal Application","hours":{"AD":33325,"DAM":328095}},{"project":"train2project","hours":{"AD":137215}},{"project":"CELLProje1","hours":{"DAM":488470}},{"project":"rangeselector","hours":{"AD":3015,"DAM":71175}},{"project":"Android dev","hours":{"AD":99160}},{"project":"Web Application","hours":{"AD":72720}}];

// get a distinct list of hour keys
var seriesData =  data.reduce( (acc, {hours}) => {
     Object.keys(hours).forEach(key => {
        if(!acc[key]) acc[key] = [];
    })
    return acc;
},{});

// reduce the original data to get categories and series values
// filling in zeros where necessary
var result = data.reduce( (acc, {project,hours}) => {
   acc.categories.push(project);
   
   Object.keys(acc.seriesData).forEach(s => {
       acc.seriesData[s].push(hours[s] || 0);
   });
   
   return acc;
},{categories:[],seriesData:seriesData});

// shape the data to how highcharts wants it
var categories = result.categories;
var series = Object.entries(result.seriesData).map( e => ({
    name: e[0],
    data:e[1]
}));

console.log(categories);
console.log(series);

这是一个更新的小提琴,用于显示 highcharts/您的数据:https://jsfiddle.net/u7opL2dw/2/

【讨论】:

  • 请注意图表中的类别形成...我已将我的项目添加到数组中..我认为它不正确..帮助我
  • @Harifrais 这就是为什么您需要更具体地回答您的问题。恐怕我无法读懂你的想法来确定你想要什么。如果您更新问题以准确显示您想要的内容,我会很乐意为您更新此答案
  • @Harifrais 获取要用作类别的项目列表非常容易(请参阅更新),但这里的问题如您的问题所述...... highcharts 中的类别通过同步系列数据来工作使用类别,并且由于数字不匹配,您的图表看起来不会像您期望的那样。
  • 你能帮我弄个小样吗
  • 嗨,你的答案没有正确显示..我昨天没注意到
【解决方案2】:

这是我的想法,如何解析您的数据以在 Highcharts 库中使用,无论 data.hours 对象中有多少属性。

演示:http://jsfiddle.net/BlackLabel/31tp0mkw/

const categories = sampleJson.map(data => data.project);

const getSeriesNames = sampleJson.map(data => {
    for (let i in data.hours) {
        return i
    }
}).filter((item, i, ar) => ar.indexOf(item) === i);


const series = getSeriesNames.map(name => {
    let output = {
        name: name,
        data: []
    };

    sampleJson.forEach(data => {
        if (data.hours[name]) {
            output.data.push(data.hours[name])
        } else {
            output.data.push(null)
        }
    });
    
    return output
})

【讨论】:

  • 您好,您的答案没有正确显示..我昨天没注意到。您能再检查一次吗
  • @Harifrais 你说得对,我修正了,通过推送未知点的空值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多