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

我想知道是否可以从“国家/地区”列创建一个包含所有唯一国家/地区值的数组,然后以某种方式为该数组中的每个值执行上述代码。有什么想法吗?或者更好的方法?

好的,所以我在这里找到了两种解决方案,一种是简单的嵌套循环,另一种是稍微更动态的方法。假设您的其余代码有效,它应该如下所示。

  1. 嵌套循环。创建一个包含所有可能国家/地区的列表,然后您可以 运行 针对各个国家/地区的功能。 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); 
    }
    
  2. 动态使用地图。 (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) 而不是列表来使它更快,我只是使用你的数组逻辑