基于从json到数组数组的日期的平均值

时间:2016-08-28 23:56:07

标签: javascript arrays json highstock

我毫不犹豫地发帖,因为我没有取得任何重大进展。我应该离开一天。 我试图按日期平均值在HighStock图表中使用。数据采用json的形式。当我在同一天有两组数据时出现问题,我需要根据日期对这些值进行平均。在给定的一天,可能有0,1或2个值。没有值的天数需要为零而不是0,所以highstock将显示差距。我一直在尝试解决问题的js解决方案。从概念上讲,这似乎很容易;按日期分组,总和除以长度。但我没有取得良好进展。这是fiddle没有我的错误。任何协助或推动正确的方向表示赞赏。

    {
"nfdrs": {
    "row": [{
        "@num": "141",
        "sta_id": "350920",
        "sta_nm": "HEHE 1",
        "latitude": "44.9559",
        "longitude": "-121.4991",
        "nfdr_dt": "08\/10\/2016",
        "nfdr_tm": "13",
        "nfdr_type": "O",
        "mp": "1",
        "msgc": "7C2P2",
        "one_hr": "5",
        "ten_hr": "6",
        "hu_hr": "11",
        "th_hr": "10",
        "xh_hr": "8",
        "ic": "28",
        "kbdi": "304",
        "sc": "8",
        "ec": "14",
        "bi": "27",
        "sl": "3-",
        "lr": "0",
        "lo": "0",
        "hr": "0",
        "ho": "0",
        "fl": "19",
        "hrb": "60",
        "wdy": "78",
        "adj": "M"
    }, {
        "@num": "142",
        "sta_id": "352108",
        "sta_nm": "WARM SPRINGS BASE",
        "latitude": "44.7795",
        "longitude": "-121.2501",
        "nfdr_dt": "08\/10\/2016",
        "nfdr_tm": "13",
        "nfdr_type": "O",
        "mp": "1",
        "msgc": "7A2A2",
        "one_hr": "5",
        "ten_hr": "6",
        "hu_hr": "8",
        "th_hr": "8",
        "xh_hr": "3",
        "ic": "19",
        "kbdi": "587",
        "sc": "34",
        "ec": "2",
        "bi": "22",
        "sl": "2",
        "lr": "0",
        "lo": "0",
        "hr": "0",
        "ho": "0",
        "fl": "16",
        "hrb": "5",
        "wdy": "60",
        "adj": "L"
    }, 

而且,如何控制代码示例的大小,同时包含所有代码>

2 个答案:

答案 0 :(得分:1)

您正在寻找的东西可以通过使用对象(或2个数组)来解决......这是带对象的示例:

$(document).ready(function() {
     $("#driver").click(function(event) {
    $.getJSON("", function(json) {

       // USE objects instead of array
       var tempObj = {};
       JSONData.nfdrs.row.forEach(function(item) {
       var erc = item.ec;
       // before adding check if the date value is already present
       if(!tempObj.hasOwnProperty(item.nfdr_dt)) {
              tempObj[item.nfdr_dt] = parseInt(erc);
          }else {
       // if present it means that the date has other value.. so  concat both the values by a UNIQUE seperator
               tempObj[item.nfdr_dt] = tempObj[item.nfdr_dt]  +'--'+parseInt(erc);
          }
                });       
        // Now proccess the object and wherever we find the string -- we can safely assume that its an extra value
        var newObj = {};
        Object.keys(tempObj).map(function(key){
           if(typeof(tempObj[key])=='string' && tempObj[key].indexOf('--') > -1) {            //use the function to convert string with unique seperator to int 
             newObj[key] = avg(tempObj[key]) ;
           }else{
           newObj[key]  = tempObj[key] ;}
        });
        $('#stage').html('<p> date: ' +  JSON.stringify(newObj) + '</p>');

    });
  });
});

//function to convert string with ints and unique separator to average of strings
function avg(val) {
    var arr = val.split('--');
    var sum =arr.reduce(function(p, c) {return parseInt(p) +parseInt( c);});
    return sum/arr.length;
}

工作小提琴:https://jsfiddle.net/80Lfqmur/11/

答案 1 :(得分:1)

我猜您的主要问题是&#34;如何在2个不同的数据集&#34; 上以编程方式执行groupBy。

有很多方法可以做到这一点。一种方法是使用reduce函数将2个数据集合并为一个完整的数据集。

示例:

&#13;
&#13;
function printAverage(data) {
  for (var time in data) {
    // Do ec
    var ec_totalValue = 0;
    data[time].ec_values.forEach(value => { ec_totalValue += value; });
    var ec_average = ec_totalValue / data[time].ec_values.length;

    // do erc
    var erc_totalValue = 0;
    data[time].erc_values.forEach(value => { erc_totalValue += value; });
    var erc_average = erc_totalValue / data[time].erc_values.length;

    console.log("Time => " + time + ", average EC => " + ec_average + ", average ERC =>" + erc_average);
  }
}

function getEpochTime(dateStr) {
  return Date.parse(dateStr);
}

function hasDataForDate(dataset, epochTime) {
  return dataset.hasOwnProperty(epochTime);
}

function addValue(dataset, item) {
  var epochKey = getEpochTime(item.nfdr_dt);
  if (!hasDataForDate(dataset, epochKey)) {
    dataset[epochKey] = {};
    dataset[epochKey].ec_values = [];
    dataset[epochKey].erc_values = [];
  }
  if (item.ec) dataset[epochKey].ec_values.push(parseInt(item.ec));
  if (item.erc) dataset[epochKey].erc_values.push(parseInt(item.erc));

  return dataset;
}

function groupRows(data) {
  return data.reduce(addValue, {});
}

var data =
{
  "nfdrs": {
    "row": [
      {
        "@num": "141",
        "sta_id": "350920",
        "sta_nm": "HEHE 1",
        "latitude": "44.9559",
        "longitude": "-121.4991",
        "nfdr_dt": "08\/10\/2016",
        "nfdr_tm": "13",
        "nfdr_type": "O",
        "mp": "1",
        "msgc": "7C2P2",
        "one_hr": "5",
        "ten_hr": "6",
        "hu_hr": "11",
        "th_hr": "10",
        "xh_hr": "8",
        "ic": "28",
        "kbdi": "304",
        "sc": "8",
        "ec": "14",
        "erc": "80",
        "bi": "27",
        "sl": "3-",
        "lr": "0",
        "lo": "0",
        "hr": "0",
        "ho": "0",
        "fl": "19",
        "hrb": "60",
        "wdy": "78",
        "adj": "M"
      },
      {
        "@num": "142",
        "sta_id": "352108",
        "sta_nm": "WARM SPRINGS BASE",
        "latitude": "44.7795",
        "longitude": "-121.2501",
        "nfdr_dt": "08\/10\/2016",
        "nfdr_tm": "13",
        "nfdr_type": "O",
        "mp": "1",
        "msgc": "7A2A2",
        "one_hr": "5",
        "ten_hr": "6",
        "hu_hr": "8",
        "th_hr": "8",
        "xh_hr": "3",
        "ic": "19",
        "kbdi": "587",
        "sc": "34",
        "ec": "2",
        "erc": "100",
        "bi": "22",
        "sl": "2",
        "lr": "0",
        "lo": "0",
        "hr": "0",
        "ho": "0",
        "fl": "16",
        "hrb": "5",
        "wdy": "60",
        "adj": "L"
      }]
  }
};

var grouped = groupRows(data.nfdrs.row);
printAverage(grouped);
&#13;
&#13;
&#13;

基本上代码的作用是它遍历数据行并检查&#34;合并的数据集&#34;已经定义了该键。

如果有,那么代码只是将该行的值推送到值数组中。否则,它定义一个JS {}对象并将其添加到该键下,然后将行值推送到该对象。

有关reduce及其含义的更多示例用法。

请参阅:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce