javascript - 具有对象的 JSON 行的计数,不包括空行

标签 javascript jquery json

我使用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,它将返回最近 30 天的 avgtime

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":[]
}

我想将 $("#avgtime").html(avgtime/datePeriod); 中的函数 datePeriod 替换为另一个计算 < 中总行数的函数strong>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);

关于javascript - 具有对象的 JSON 行的计数,不包括空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48141639/

相关文章:

JavaScript 函数——用 wheel 事件调用一次?

javascript - 从下拉列表中选择项目时的 Firebug 行为

java - 在 Android 中使用 MySql 项目将 JSON 转换为字符串

php - 使用 jquery fullcalender 通过数据库值将值附加到粗体

javascript - JSON数据存入变量后获取

javascript - 使用我的 JavaScript 数组的内容作为 URL 在页面加载时重定向到另一个网页

jquery - 更改 Google 图表中图表范围过滤器的值

Jquery 显示和隐藏而不是切换

java - 用java解析json

javascript - 如何在javascript中的外部函数内隐藏按钮