基于从 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
我对 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