【问题标题】:Extracting multi-dimentsional arrays in Javascript/JQuery在 Javascript/JQuery 中提取多维数组
【发布时间】:2015-05-10 13:30:55
【问题描述】:

我正在从 SQL 源中提取一些数据,我可以将这些数据作为一个简单的数组(按日期分组显示)放入 javascript 脚本中,其中包含周数、任务数和花费的小时数:

mydata = [

  // weekno, taskno, hours

  ["2014-14",160,37.5],

  ["2014-15",160,30],
  ["2014-15",243,7.5],

  ["2014-16",160,37.5],

  ["2014-17",0,7.5],
  ["2014-17",3,7.5],
  ["2014-17",321,22.5],

  ["2014-18",0,7.5],
  ["2014-18",321,30],

  ["2014-19",3,7.5],
  ["2014-19",295,30]
];

我将使用 HighCharts 绘制它,我需要将它放入两个属性数组中,如下所示:

properties = {
  categories: [ "2014-14","2014-15","2014-16","2014-17","2014-18","2014-19"],

  series: [
    //      Task           Week
    //      No             14    15    16    17    18    19
    //
    { name: '0',   data: [ 0,    0,    0,    7.5,  7.5,  0   ] },
    { name: '3',   data: [ 0,    0,    0,    7.5,  0,    7.5 ] },
    { name: '160', data: [ 37.5, 30,   37.5, 0,    0,    0   ] },
    { name: '243', data: [ 0,    7.5,  0,    0,    0,    0   ] },
    { name: '295', data: [ 0,    0,    0,    0,    0,    30  ] },
    { name: '321', data: [ 0,    0,    0,    22.5, 30,   0   ] }
  ]
}  

除了循环之外,我是否缺少一些简洁、惯用的方法来执行此操作?

【问题讨论】:

  • 简短的回答是否定的,循环在这里是必不可少的。您也许可以找到一个可以简化工作的库,但它仍然会遍历数据。
  • 除了循环之外,如果您想避免循环内循环类型的逻辑,您还需要查找映射。
  • 在 highcharts 中,您应该使用时间戳而不是字符串作为日期。所以你需要转换它(通过即 Date.parse 或使用 Date.UTC)。

标签: javascript jquery multidimensional-array highcharts idioms


【解决方案1】:

如果它对任何人都有用,这里有一个拼凑的解决方案:

function onlyUnique(value, index, self) {
    return self.indexOf(value) === index;
}
var categories = [];
var subcategories = [];
var temp = {};
for (var i = 0; i < myChartData.length; i++) {
    key = myChartData[i][0];
    taskno = myChartData[i][1];
    hours = myChartData[i][2];
    if (taskno in temp == false) temp[taskno] = {};
    if (key in temp[taskno] == false) temp[taskno][key] = 0;
    temp[taskno][key] += hours;
    categories.push(myChartData[i][0]);
    subcategories.push(myChartData[i][1])
}
var uniqueCategories = categories.filter(onlyUnique).sort();
var uniqueSubcategories = subcategories.filter(onlyUnique).sort(function(a, b) {
    return a - b
});

var series = [];

for (var i = 0; i < uniqueSubcategories.length; i++) {
    subcatKey = uniqueSubcategories[i];
    series[i] =  { name: 'Task ' + subcatKey,   data: [] };
    for (var j = 0; j < uniqueCategories.length; j++) {
        catKey = uniqueCategories[j];
        series[i]['data'].push(temp[subcatKey][catKey] ? temp[subcatKey][catKey] : 0);
    }
}

其中seriesuniqueCategories 是必需的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多