AngularJS:SubTotals和Totals

时间:2015-02-08 22:15:56

标签: angularjs

我已将自己编入角落,无法弄清楚如何计算小计(每种作物)和总计(所有作物)。我现在有硬编码的预期值,但需要弄清楚如何计算它们。

I have a plunker

我使用budget.json来模拟工厂中对数据库的调用(在budget.js中定义)。 BudgetsController也在budget.js。

中定义

硬编码总数从budgets.js第35行开始。我尝试了几种LoDash方法来计算总数,但似乎无法找到我可以为每种作物复制的模式,我知道Totals总数将遵循相同的模式,但只使用小计。

感谢任何帮助!

budget.js的代码:

(function(){
  'use strict';
  angular
    .module('ARM')
    .factory('ExpensesFactory', function ExpensesFactory(
      $http, $q
    ) {

      return {
        getBudget: getBudget
      };

      function getBudget(id){
        return $http.get('budget.json');
      }

    })
      .controller('BudgetsController', BudgetsController);

    BudgetsController.$inject = ['$scope', 'ExpensesFactory'];

    function BudgetsController(
        $scope, ExpensesFactory
    ){
      ExpensesFactory.getBudget('1')
        .then(function success(rsp){
          var arr = rsp.data;
          var flattened = _.flatten(arr);

          var grped = _.groupBy(flattened, function(item) {
            return item.crop;
          });
          $scope.uses = grped;

          //TODO: Crop and Loan Budget Totals
          $scope.uses.totals = [
            //CORN
            [
              {
                "arm": 178,
                "dist": 197.91,
                "other": 115,
                "peracre": 490.91,
                "calc_arm": 61837.2,
                "calc_dist": 68753.934,
                "calc_other": 39951,
                "calc_total": 170542.134
              }
            ],
            //SOYBEANS
            [
              {
                "arm": 145,
                "dist": 69.73,
                "other": 74.35,
                "peracre": 289.08,
                "calc_arm": 84143.5,
                "calc_dist": 40464.319,
                "calc_other": 43145.305,
                "calc_total": 167753.124
              }
            ],
            //SORGHUM
            [
              {
                "arm": 0,
                "dist": 0,
                "other": 0,
                "peracre": 0,
                "calc_arm": 0,
                "calc_dist": 0,
                "calc_other": 0,
                "calc_total": 0
              }
            ],
            //WHEAT
            [
              {
                "arm": 0,
                "dist": 0,
                "other": 0,
                "peracre": 0,
                "calc_arm": 0,
                "calc_dist": 0,
                "calc_other": 0,
                "calc_total": 0
              }
            ],
            //COTTON
            [ 
              {
              "arm": 0,
              "dist": 0,
              "other": 0,
              "peracre": 0,
              "calc_arm": 0,
              "calc_dist": 0,
              "calc_other": 0,
              "calc_total": 0
            }
            ],
            //RICE
            [
              {
                "arm": 0,
                "dist": 0,
                "other": 0,
                "peracre": 0,
                "calc_arm": 0,
                "calc_dist": 0,
                "calc_other": 0,
                "calc_total": 0
              }
            ],
            //PEANUTS
            [
              {
                "arm": 0,
                "dist": 0,
                "other": 0,
                "peracre": 0,
                "calc_arm": 0,
                "calc_dist": 0,
                "calc_other": 0,
                "calc_total": 0
              }
            ],
            //SUGAR CANE
            [ 
              {
              "arm": 0,
              "dist": 0,
              "other": 0,
              "peracre": 0,
              "calc_arm": 0,
              "calc_dist": 0,
              "calc_other": 0,
              "calc_total": 0
            }
            ],
            //TOTALS
            [ 
              {
                "arm": 0,
                "dist": 0,
                "other": 0,
                "peracre": 0,
                "calc_arm": 155999,
                "calc_dist": 36530,
                "calc_other": 87223,
                "calc_total": 279752
              }
            ]
          ];

          var uniqExp = _.uniq(_.pluck(flattened, 'expense'));
          $scope.exp = uniqExp;
        });
    } // end BudgetsController fn
})();

1 个答案:

答案 0 :(得分:1)

让我们看看你有什么:

  1. _。groupBy:返回其键为裁剪名称的对象;
  2. _。map:迭代grped个键(裁剪名称)并返回一个数组;
  3. item.reduce():原生数组方法,通过整个数组累积一些值
    1. current:reduce每次都从数组传递不同的元素;
    2. 上一篇:这个我们处于控制状态,第一次它包含第二个reduce()参数的值,这就是我传递一个固定对象的原因。每次迭代都会修改此对象。
  4. 有关Array.prototype.reduce的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

    样品:

          $scope.uses = _.map(grped, function (item, key) {
            return item.reduce(function (previous, current) {
              // in the nth iteration, each previous property will be equal to sum(arr[0].property...arr[n-1].property)
              previous.arm += current.arm;
              previous.dist += current.dist;
              previous.other += current.other;
              // other fields should be summed here
    
              // remember to return the accumulator
              return previous;
            },
              /* initialize each property to zero, otherwize it won't work */ 
              {crop: key, arm: 0, dist: 0, other: 0});
          });