将JSON数据转换为Highcharts中的格式'基本折线图

时间:2015-04-27 22:12:30

标签: javascript jquery arrays json highcharts

使用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)。

所以我问:

  1. 在我的originalArray中进行迭代,匹配唯一值以及然后仅对这些匹配进行操作以推送到desiredArray的好方法。< / LI>
  2. desiredArray[i].data
  3. 中增加计数器的最佳方法是什么

    我愿意使用库,例如​​underscore.js。一直试图解决这个问题几天,所以几乎任何东西都在Javascript的范围内。

2 个答案:

答案 0 :(得分:2)

现在更新了正确的数组初始化。

string Vehicle::getVIN()
{   return VIN;     }

void Vehicle::setVIN(string input)
{   VIN = input;    }

我们在这里做的是一个多步骤的过程:

  1. 首先扫描原始数组中的最大值,确定我们的数组需要多大。

  2. 使用对象聚合计数(使用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]}; }); )。

  3. 将对象及其属性转换为名称/数据对对象数组(使用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);