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

Average values based on date from json to array of arrays

我对 post 犹豫不决,因为我没有取得重大进展。我可能应该离开一天。 我正在尝试按日期计算平均值以用于 HighStock 图表。数据格式为json。当我在同一天有两组数据时,问题就出现了,我需要根据日期对这些值进行平均。在给定的一天可能有 0、1 或 2 个值。没有值的天数必须为 null 而不是 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 个数组)来解决...这是对象的示例:

$(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;
}

工作fiddle:https://jsfiddle.net/80Lfqmur/11/

我猜你的主要问题是 "how do I pro grammatically perform a groupBy on 2 different dataset".

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

示例:

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);

本质上,代码所做的是循环遍历数据行并检查 "merged dataset" 是否已经定义了该键。

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

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

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