【问题标题】:Return average of all JSON values返回所有 JSON 值的平均值
【发布时间】:2016-02-20 13:41:00
【问题描述】:

我有一个(部分)工作函数,我试图在其中找到此数据集中所有视频的平均持续时间。

目前只返回最后一个v.duration/data.media.length,而不是v.duration/data.media.length的总和。

有什么帮助吗?

$.getJSON(projectMedias, function (data) {
    $.each(data.medias, function (i, v) {
        var duration = v.duration;
        var medias = data.medias.length;
        var avg = duration/medias;
        $('#avg').html(avg); 
    })
});

【问题讨论】:

  • 跟踪循环的总outside,然后计算循环after的平均值。容易。
  • 查看变量的范围,并像 Musefan 所说的那样,计算循环外的平均值。

标签: jquery json each average


【解决方案1】:

您的代码的问题在于,您在尝试计算平均值时只考虑了循环的当前元素。对于平均值,您需要所有元素的总和和元素的数量。在循环内部,您只需要增加总数。这可以通过多种方式完成,但主要是为了保留您的代码:

var total = 0
$.getJSON(projectMedias, function (data) {
    $.each(data.medias, function (i, v) {
        total += v.duration;
    })
    var avg = total/data.medias.length;
    $('#avg').html(avg); 
});

奖金 - 只是为了好玩

如果你想尝试用一个单行来做到这一点,你可以利用 javascript 的一些新功能,而完全跳过 jQuery:

var avg = data.medias.map(function(a){return a.duration;})
                     .reduce(function(a,b){return a+b;})/data.medias.length;

第一部分 map 返回一个数组,在这种情况下,是键 duration 的所有值,然后通过在该数组上调用 reduce,我们可以对所有值求和,最后得到以前的代码是total。将该值除以medias 中的元素总数,得出平均值。

假设数据结构类似于data = { medias : [{duration:0},{duration:10}] };

【讨论】:

    【解决方案2】:

    将循环内持续时间的总和相加,然后除以循环外的长度。

    var sum = 0;
    $.each(data.medias, function (i, v) {
        var duration = v.duration;
        sum += duration;
    })
    var avg = sum / data.medias.length;
    $('#avg').html(avg);
    

    【讨论】:

      【解决方案3】:
      $.getJSON(projectMedias, function (data) {
      
          var _sum = 0;
      
          // Loop in to calculate the sum.
          [].forEach.call(data.media, function(inst){
              _sum += inst.duration;
          });
      
          //Devide with length to get the average
          var _avg = _sum/data.medias.length;
      
          $('#avg').html(_avg);
          console.log(_avg);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        相关资源
        最近更新 更多