使用 JavaScript 从 table 创建多系列 FusionCharts 的数据集

Create DataSet for Multi-Series FusionCharts from table using JavaScript

我有来自 table 的数据:

var my_data = [
{"series":"group1", "type":"device1", "value":15},
{"series":"group1", "type":"device3", "value":12},
{"series":"group2", "type":"device1", "value":16},
{"series":"group2", "type":"device1", "value":11},
{"series":"group2", "type":"device2", "value":17},
{"series":"group2", "type":"device2", "value":18},
{"series":"group2", "type":"device3", "value":10},
{"series":"group2", "type":"device4", "value":14},
{"series":"group3", "type":"device1", "value":13},
{"series":"group3", "type":"device3", "value":19},
{"series":"group3", "type":"device4", "value":11},
{"series":"group3", "type":"device4", "value":15}
];

我正在努力使用代码将其转换为 FusionCharts 多系列图表所需的类别和数据集...结果应该是:

var my_categories = [{"category": [{"label": "device1"}, {"label": "device2"}, {"label": "device3"}, {"label": "device4"}]}];

var my_dataset = [
{"seriesname": "group1", "data": [{"value": 15}, {"value": 0}, {"value": 12}, {"value": 0}]}, 
{"seriesname": "group2", "data": [{"value": 27}, {"value": 35}, {"value": 10}, {"value": 14}]},
{"seriesname": "group3", "data": [{"value": 13}, {"value": 0}, {"value": 19}, {"value": 26}]}
];

挑战在于数据集顺序必须与类别相匹配,并且数据值需要按类别汇总到单个设备。

如何转换这些数据?我假设第一步是使用 for 循环获取类别。但在那之后,我被难住了。

这是工作图表,但手动转换了数据: http://jsfiddle.net/yqqbqqe9/

您可以为类别创建一些辅助对象,并作为对同一系列的引用。然后为新系列构建一个对象,该对象的值数组全为零。

至少给对应的对象加上值

此提议适用于未排序的数据,但首次出现的顺序构建了系列的顺序。如有必要,可以稍后进行排序。

var data = [{ series: "group1", type: "device1", value: 15 }, { series: "group1", type: "device3", value: 12 }, { series: "group2", type: "device1", value: 16 }, { series: "group2", type: "device1", value: 11 }, { series: "group2", type: "device2", value: 17 }, { series: "group2", type: "device2", value: 18 }, { series: "group2", type: "device3", value: 10 }, { series: "group2", type: "device4", value: 14 }, { series: "group3", type: "device1", value: 13 }, { series: "group3", type: "device3", value: 19 }, { series: "group3", type: "device4", value: 11 }, { series: "group3", type: "device4", value: 15 }],
    categories = [{ category: [{ label: "device1" }, { label: "device2" }, { label: "device3" }, { label: "device4" }] }],
    result = data.reduce(function (categories) {
        var catIndex = categories.reduce(function (r, o, i) {
                r[o.label] = i;
                return r;
            }, {}),
            series = Object.create(null);
            
        return function (r, o) {
            if (!series[o.series]) {
                series[o.series] = {
                    seriesname: o.series,
                    data: categories.map(function () { return { value: 0 } })
                };
                r.push(series[o.series]);
            }
            series[o.series].data[catIndex[o.type]].value += o.value;
            return r;
        };
    }(categories[0].category), []);


console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }