Javascript 将JSON数据转换为Highcharts';基线图
使用Javascript,我试图将一些JSON数据转换为Highcharts的基本折线图中使用的格式 我必须从什么开始:Javascript 将JSON数据转换为Highcharts';基线图,javascript,jquery,arrays,json,highcharts,Javascript,Jquery,Arrays,Json,Highcharts,使用Javascript,我试图将一些JSON数据转换为Highcharts的基本折线图中使用的格式 我必须从什么开始: originalArray = [ ['valueA', 1], ['valueA', 0], ['valueB', 9], ['valueB', 9], ['valueB', 3], ['valueC', 11] ] 以及我正试图使用上述内容创建的内容: desiredArray = [{ name: 'valu
originalArray = [
['valueA', 1],
['valueA', 0],
['valueB', 9],
['valueB', 9],
['valueB', 3],
['valueC', 11]
]
以及我正试图使用上述内容创建的内容:
desiredArray = [{
name: 'valueA',
data: [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}, {
name: 'valueB',
data: [0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0]
}, {
name: 'valueC',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
}]
对于一些其他上下文,originalArray[i][1]
中的0-11引用了一个月(0=1月),而desiredArray
是一个唯一名称的列表以及它们每月出现的次数
到目前为止,我可以:
originalArray = [
['valueA', 1],
['valueA', 0],
['valueB', 9],
['valueB', 9],
['valueB', 3],
['valueC', 11]
]
- 将数据转换为新的对象数组
- 对于
originalArray
- 在
中创建一个新对象,并设置desiredArray
属性name
- 添加包含空数组的
属性data
- 在
originalArray = [
['valueA', 1],
['valueA', 0],
['valueB', 9],
['valueB', 9],
['valueB', 3],
['valueC', 11]
]
- 在
原始数组中循环
- 如果
原始数组中的名称与
所需数组中的名称匹配
- 使用
的值作为索引(它始终为0-11),在匹配的originalArray[i][1]
数组中递增一个计数器seriesArray[i].data
- 使用
- 如果
originalArray = [
['valueA', 1],
['valueA', 0],
['valueB', 9],
['valueB', 9],
['valueB', 3],
['valueC', 11]
]
原始数组
,匹配唯一值,然后仅对这些匹配进行操作以推送到所需数组
,这样做的好方法是什么desiredArray[i].data中增加计数器的最佳方法是什么
我对使用库持开放态度,例如下划线.js。几天来,我一直在努力解决这个问题,所以几乎所有内容都在Javascript的范围内。现在,通过正确的数组初始化进行更新
var max = originalArray.reduce(function(p,c){return Math.max(p,c[1]);},0);
var initSums = function(size) {
var arr = new Array(size);
for (var i=0;i<size;i++)
arr[i]=0;
return arr;
}
var map = originalArray.reduce(function(sums,val){
if (!sums.hasOwnProperty(val[0])) {
sums[val[0]] = initSums(max+1);
}
sums[val[0]][val[1]]++;
return sums;
},{});
var desiredArray = Object.keys(map).map(function(key) {
return {name: key, data: map[key]};
});
var max=originalArray.reduce(函数(p,c){return Math.max(p,c[1]);},0);
var initSums=函数(大小){
var arr=新阵列(大小);
对于(var i=0;iEdit:对S McCochran解决方案的改进,跳过了对原始数组中最大值的无关搜索,因为每个数据数组中应该始终有12个元素,每个月一个
function formatForHighcharts(array) {
// Create a map from value name to array of month counts
var map = originalArray.reduce(function(sums, pair) {
var key = pair[0], val = pair[1];
if(!(key in sums))
sums[key] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
// val is the month index, which corresponds directly to array index, so increase that
sums[key][val]++;
return sums;
}, {});
// Map the object to an array of { name: ..., data: ... } pairs
var formatted = Object.keys(map).map(function (key) {
return { name: key, data: map[key] };
});
return formatted;
}
用法:
var desiredArray = formatForHighcharts(originalArray);
顺便说一句,desiredArray中valueB条目中的计数是错误的,我认为……数据[3]中应该有1?@smcrohan很好的捕获,更新了一个注释——据我所知,搜索max
不仅是不必要的,而且实际上是有害的。数组的长度应该始终为12,每个月一个。如果valueC
从原始数组
中删除,结果将不正确。嗯,同意。不确定这是否正确是后来添加到问题中的,或者如果我读过它,但是如果数组确实总是相同的大小,那么是的,该检查是无关的。不,它从一开始就存在。也许我应该发表评论,而不是仅仅提供我的解决方案。@SeanConnelly可能会回来,如果他发现它不起作用。:-)