使用Meteor.js进行收集的平均函数

时间:2015-08-27 16:55:58

标签: javascript mongodb meteor collections

我需要使用Meteor.js在集合中使用多个值来计算平均值。

特别是,我需要计算两件事:

  1. 最后一个 obj.km
  2. 之间的差异
  3. 所有 obj.liters
  4. 的总和

    使用javascript我会写这样的东西:

    var arr = [{
          'km': 12000,
          'liters': 20
       }, {
          'km': 12140,
          'liters': 50
       }, {
          'km': 12240,
          'liters': 45
       }];
    
    function calculate_avg() {
       
       var sum_liters = 0,
           arrlength = arr.length;
       
       for(i = 0; i < arrlength; i++) {
          sum_liters += arr[i].liters;
       }
    
       return ((arr[arrlength-1].km - arr[0].km)/sum_liters);
    };

    在meteor中我定义了一个名为“Refills”的集合:

    Refills = new Meteor.collection('refills');
    
    // and I insert some example data like in the javascript array
    Refills.insert({
       'km': 12000,
        'liters': 20
    });
    
    Refills.insert({
       'km': 12500,
        'liters': 15
    });
    
    Refills.insert({
       'km': 13000,
        'liters': 35
    });
    
    //etc.

    最好的方法是什么?

    我试着这样做:

    Template.refills.helpers({
      
        avg: function(){
            var sum_liters = 0,
                diff_km = 0;
    
            Refills.find().map(function (doc, index, cursor) {
                    
                    //?? var diff_km = doc[last].km - doc[0].km
                    var sum_liters += doc.liters;
                
                    return ((/*diff_km*/)/sum_liters);
                
            });
            
        }
    
    });

    提前感谢任何有帮助的人。

1 个答案:

答案 0 :(得分:1)

尝试一下:

Template.refills.helpers({
  avg: function() {
    // sort refills by km so the math in the last step makes sense
    var refills = Refills.find({}, {sort: {km: 1}}).fetch();
    // use a simple reduce to compute the sum
    var totalLiters = _.reduce(refills, (function(s, r) {return s + r.liters;}), 0);
    // return the average (total distance) / (total liters)
    return (_.last(refills).km - _.first(refills).km) / totalLiters;
  }
});

您需要在光标上使用fetch,以便操作数组。