使用Javascript,我试图将一些JSON数据转换为Highcharts中使用的格式'基本折线图。
我必须从以下开始:
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
是唯一名称列表及其按月出现的计数。< / p>
到目前为止,我可以:
originalArray
中的每个唯一名称
desiredArray
中创建新对象,并设置name
属性data
属性但是我遇到了麻烦,无法弄清楚如何:
originalArray
originalArray
中的名称与desiredArray
中的名称相匹配
seriesArray[i].data
数组中增加一个计数器,使用originalArray[i][1]
的值作为索引(始终为0-11)。所以我问:
originalArray
中进行迭代,匹配唯一值以及然后仅对这些匹配进行操作以推送到desiredArray
的好方法。< / LI>
desiredArray[i].data
我愿意使用库,例如underscore.js。一直试图解决这个问题几天,所以几乎任何东西都在Javascript的范围内。
答案 0 :(得分:2)
现在更新了正确的数组初始化。
string Vehicle::getVIN()
{ return VIN; }
void Vehicle::setVIN(string input)
{ VIN = input; }
我们在这里做的是一个多步骤的过程:
首先扫描原始数组中的最大值,确定我们的数组需要多大。
使用对象聚合计数(使用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]};
});
)。
将对象及其属性转换为名称/数据对对象数组(使用Array.reduce()
)。
答案 1 :(得分:0)
编辑:S McCochran解决方案的改进,跳过无关搜索originalArray
中的最大值,因为每个数据阵列应始终有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);