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

使用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
是一个唯一名称的列表以及它们每月出现的次数

到目前为止,我可以:

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]
]
  • 原始数组中循环
    
    • 如果
      原始数组中的名称与
      所需数组中的名称匹配
      • 使用
        originalArray[i][1]
        的值作为索引(它始终为0-11),在匹配的
        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可能会回来,如果他发现它不起作用。:-)