我正在使用API​​来生成平均花费在访问网页上的时间,然后将所有返回值的总和除以API中设置的天数。

let avgtime = 0;

for (i in data) {
  if (data[i].avg_time_on_site) {
    avgtime += data[i].avg_time_on_site;
  }
}
$("#avgtime").html(avgtime / datePeriod);


datePeriod是API返回的总天数。例如,如果datePeriod设置为30,它将返回avgtime的最近30天。

avgtime += data[i].avg_time_on_site;的摘录从JSON中返回所有avg_time_on_site作为总和,并除以datePeriod以获得设置的天数$("#avgtime").html(avgtime / datePeriod);中的平均值。

但是,我的问题是,这仅在网页每天都有返回值的情况下才有效。如果无法在一天之内访问该网页,如下面的示例JSON所示,avgtime将是不正确的,因为它将所有返回值的总和除以总天数,而不是有行的总天数。

{
   "2017-12-30":[],
   "2017-12-31":{
      "nb_uniq_visitors":1,
      "nb_visits":1,
      "avg_time_on_site":41,
   },
   "2018-01-01":{
      "nb_uniq_visitors":1,
      "nb_visits":2,
      "avg_time_on_site":52,
   },
   "2018-01-02":[],
   "2018-01-03":{
      "nb_uniq_visitors":1,
      "nb_visits":3,
      "avg_time_on_site":83,
   },
   "2018-01-04":[]
}


我想将datePeriod中的$("#avgtime").html(avgtime / datePeriod);函数替换为另一个计数JSON中总行的函数,但不包括没有值的日子。

我尝试过首先研究解决方案,但很茫然。谢谢您的帮助。

这是我的完整剧本



setTimeout(function() {
  $('#DateSelector').val('30').trigger("change")
}, 1000);

function datePeriod() {
  let datePeriod = $("#DateSelector").val();
  $("#DateShow").html(datePeriod);
  $.getJSON(`https://discovrbookings.innocraft.cloud/?module=API&method=API.get&format=json&idSite=2&period=day&date=last${datePeriod}&token_auth=68aa5bd12137f13255dcb98794b65dff`, (data) => {
    //console.log(data);
    let avgtime = 0;

    for (i in data) {
      if (data[i].avg_time_on_site) {
        avgtime += data[i].avg_time_on_site;
      }
    }
    $("#avgtime").html(avgtime / datePeriod);
  });
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select name="DateSelector" id="DateSelector" onchange="datePeriod();">
   <option value="7">Last 7 Days</option>
   <option value="14">Last 14 Days</option>
   <option value="30">Last 30 Days</option>
   <option value="90">Last 90 Days</option>
   <option value="365">Last 365 Days</option>
</select>

<h2 id="avgtime"></h2>

最佳答案

我建议您只使用另一个变量来跟踪循环中的日子。这样,您就独立于datePeriod

let avgtime = 0;
//another variable, because you can't use datePeriod
let dayCount = 0;

for (i in data) {
  if (data[i].avg_time_on_site) {
    avgtime += data[i].avg_time_on_site;
    dayCount++;
  }
}
$("#avgtime").html(avgtime / dayCount);

07-26 02:54