JS根据相邻列中的值找到动态平均值数
JS find a dynamic number of averages based on value in adjacent column
刚接触编码并试图解决这个问题。我有 HTML table 列标题的数据:
大陆、国家、城市、平均气温
table数据很长,有很多国家——每个国家有多个条目(即不同的城市)。 我想计算每个国家/地区的平均温度——即将具有相同国家/地区的所有条目的平均温度列相加,然后除以该条目数。
我的目标是最终得到两个数组,它们可以插入到图表中,其中 X-Axis 为 'Country' 和 Y-Axis共 'Avg Temp'.
我相信下面的代码可以用于其中的一些,但我必须为每个国家(有数百个国家)复制并粘贴它。
//read the data from the HTML table
var data = document.getElementById("myTable");
//find array values that match a country and push to new array, then convert array to integer
var canada= [];
var j = 0;
for (j; j < data.rows.length; j++) {
if ( data.rows[j].cells[1].innerHTML.indexOf("Canada") >= 0)
canada.push(data.rows[j].cells[3].innerHTML);
{
//sum the array for a country, find average, and push to a new array to plug into a chart
function getSum(total, num) {
return total + num;
}
myChartData.push(canada.reduce(getSum,0)/canada.length);
我想知道是否可以从“国家/地区”列创建一个包含所有唯一国家/地区值的数组,然后以某种方式为该数组中的每个值执行上述代码。有什么想法吗?或者更好的方法?
好的,所以我在这里找到了两种解决方案,一种是简单的嵌套循环,另一种是稍微更动态的方法。假设您的其余代码有效,它应该如下所示。
嵌套循环。创建一个包含所有可能国家/地区的列表,然后您可以 运行 针对各个国家/地区的功能。 O(n^2)
//create a list of countries
const countries = ["Canada", "India", "Austrailia"];
for (const element of countries){
console.log(element);
var temperatures = []
for (j = 0 ; j < data.rows.length; j++){
if (data.rows[j].cells[1].innerHTML.indexOf(element) >= 0)
temperatures.push(data.rows[j].cells[3].innerHTML);
}
//assuming this was an array defined before. you can plot countries to myChartData
myChartData.push(temperatures.reduce(getSum,0)/temperatures.length);
}
动态使用地图。 (O)(n) + 一点点
//list of countries to simulate data (country, temp)
const data = [["Canada",12], ["India",10], ["Austrailia",20],
["Canada",0],["Canada",18],["India",10]];
let countryTemp = new Map();
for (const element of data){
//element[1] is data.rows[j].cells[3].innerHTML) or temp
//element[0] is data.rows[j].cells[1].innerHTML) or country
var temp = [];
//if exists collect list
if(countryTemp.has(element[0]))
temp = countryTemp.get(element[0])
//append to list of tmepratures
temp.push(element[1]);
countryTemp.set(element[0],temp);
}
//u can plot country list to avg temp list.
var countryList = [];
var avgTemperaturelist =[];
for(const val of countryTemp){
countryList.push(val[0]);
avgTemperaturelist.push(val[1].reduce(getSum,0)/val[1].length);
}
提示:你可以通过在地图中使用 (sum 和 len(unto-increment) 而不是列表来使它更快,我只是使用你的数组逻辑
刚接触编码并试图解决这个问题。我有 HTML table 列标题的数据:
大陆、国家、城市、平均气温
table数据很长,有很多国家——每个国家有多个条目(即不同的城市)。 我想计算每个国家/地区的平均温度——即将具有相同国家/地区的所有条目的平均温度列相加,然后除以该条目数。
我的目标是最终得到两个数组,它们可以插入到图表中,其中 X-Axis 为 'Country' 和 Y-Axis共 'Avg Temp'.
我相信下面的代码可以用于其中的一些,但我必须为每个国家(有数百个国家)复制并粘贴它。
//read the data from the HTML table
var data = document.getElementById("myTable");
//find array values that match a country and push to new array, then convert array to integer
var canada= [];
var j = 0;
for (j; j < data.rows.length; j++) {
if ( data.rows[j].cells[1].innerHTML.indexOf("Canada") >= 0)
canada.push(data.rows[j].cells[3].innerHTML);
{
//sum the array for a country, find average, and push to a new array to plug into a chart
function getSum(total, num) {
return total + num;
}
myChartData.push(canada.reduce(getSum,0)/canada.length);
我想知道是否可以从“国家/地区”列创建一个包含所有唯一国家/地区值的数组,然后以某种方式为该数组中的每个值执行上述代码。有什么想法吗?或者更好的方法?
好的,所以我在这里找到了两种解决方案,一种是简单的嵌套循环,另一种是稍微更动态的方法。假设您的其余代码有效,它应该如下所示。
嵌套循环。创建一个包含所有可能国家/地区的列表,然后您可以 运行 针对各个国家/地区的功能。 O(n^2)
//create a list of countries const countries = ["Canada", "India", "Austrailia"]; for (const element of countries){ console.log(element); var temperatures = [] for (j = 0 ; j < data.rows.length; j++){ if (data.rows[j].cells[1].innerHTML.indexOf(element) >= 0) temperatures.push(data.rows[j].cells[3].innerHTML); } //assuming this was an array defined before. you can plot countries to myChartData myChartData.push(temperatures.reduce(getSum,0)/temperatures.length); }
动态使用地图。 (O)(n) + 一点点
//list of countries to simulate data (country, temp) const data = [["Canada",12], ["India",10], ["Austrailia",20], ["Canada",0],["Canada",18],["India",10]]; let countryTemp = new Map(); for (const element of data){ //element[1] is data.rows[j].cells[3].innerHTML) or temp //element[0] is data.rows[j].cells[1].innerHTML) or country var temp = []; //if exists collect list if(countryTemp.has(element[0])) temp = countryTemp.get(element[0]) //append to list of tmepratures temp.push(element[1]); countryTemp.set(element[0],temp); } //u can plot country list to avg temp list. var countryList = []; var avgTemperaturelist =[]; for(const val of countryTemp){ countryList.push(val[0]); avgTemperaturelist.push(val[1].reduce(getSum,0)/val[1].length); }
提示:你可以通过在地图中使用 (sum 和 len(unto-increment) 而不是列表来使它更快,我只是使用你的数组逻辑