在 AngularJS 中分组

Group By in AngularJS

你好,我需要从下面的代码 table 中输出一个 table,就像这样。我只是不能做 groupBY 名称。 希望此视图看起来像

 Shareholder | Preferred Stock | Common Stock | Options | Percentage |
|-------------+-----------------+--------------+---------+------------|
| Robert      |              35 |           20 |      15 |        54% |
| Bert        |              20 |           20 |      10 |        38% |
| Elizabeth   |              10 |              |         |         8% |
| Total       |              65 |           40 |      25 |       100% |
*/
angular.module('myApp.view2', ['ngRoute'])

.config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/view2', {
    templateUrl: 'view2/view2.html',
    controller: 'View2Ctrl'
  });
}])



.controller('View2Ctrl', ['$scope', function($scope) {
    $scope.transactions = [
    { security: 'Preferred Stock',  name: 'Robert',    value: 5,   date: '2014-1-3' },
    { security: 'Preferred Stock',  name: 'Robert',    value: 5,   date: '2014-1-5' },
    { security: 'Common Stock',     name: 'Bert',      value: 20,  date: '2014-1-6' },
    { security: 'Preferred Stock',  name: 'Elizabeth', value: 10,  date: '2014-1-6' },
    { security: 'Common Stock',     name: 'Robert',    value: 20,  date: '2014-1-9' },
    { security: 'Preferred Stock',  name: 'Bert',      value: 20,  date: '2014-1-11' },
    { security: 'Preferred Stock',  name: 'Robert',    value: 5,   date: '2014-1-12' },
    { security: 'Preferred Stock',  name: 'Robert',    value: 15,  date: '2014-1-12' },
    { security: 'Options',          name: 'Bert',      value: 10,  date: '2014-1-13' },
    { security: 'Preferred Stock',  name: 'Robert',    value: 5,   date: '2014-1-14' },
    { security: 'Options',          name: 'Robert',    value: 15,  date: '2014-1-17' }
    ];
}]);

这不是完整的解决方案,但可能是您的起点:

var grouped = {};
$scope.transactions.forEach(function (tx) {
  var group;
  if (grouped.name) {
    group = grouped.name;
  } else {
    group = {name: tx.name};
    group[name] = group;
  }
  if (group[tx.security]) {
    group[tx.security] += tx.value;
  } else {
    group[tx.security] = tx.value;
  }
});

你会计算百分比,我相信你!

var transactions = [
    { security: 'Preferred Stock',  name: 'Robert',    value: 5,   date: '2014-1-3' },
    { security: 'Preferred Stock',  name: 'Robert',    value: 5,   date: '2014-1-5' },
    { security: 'Common Stock',     name: 'Bert',      value: 20,  date: '2014-1-6' },
    { security: 'Preferred Stock',  name: 'Elizabeth', value: 10,  date: '2014-1-6' },
    { security: 'Common Stock',     name: 'Robert',    value: 20,  date: '2014-1-9' },
    { security: 'Preferred Stock',  name: 'Bert',      value: 20,  date: '2014-1-11' },
    { security: 'Preferred Stock',  name: 'Robert',    value: 5,   date: '2014-1-12' },
    { security: 'Preferred Stock',  name: 'Robert',    value: 15,  date: '2014-1-12' },
    { security: 'Options',          name: 'Bert',      value: 10,  date: '2014-1-13' },
    { security: 'Preferred Stock',  name: 'Robert',    value: 5,   date: '2014-1-14' },
    { security: 'Options',          name: 'Robert',    value: 15,  date: '2014-1-17' }
    ];

var summary = [];
var total = {name: 'Total', 'Preferred Stock': 0, 'Common Stock': 0, 'Options': 0};

for(var i = 0; i < transactions.length; i++) {
  var sec = transactions[i].security;
  var val = transactions[i].value;
  total[sec] += val;

  var found = false;
  for(var j = 0; j < summary.length; j++) {
    if(transactions[i].name === summary[j].name) {
      summary[j][sec] += val;
      found = true;
    }
  }

  if(!found) {
    var item = {name: transactions[i].name, 'Preferred Stock': 0, 'Common Stock': 0, 'Options': 0 };
    item[sec] += val;
    summary.push(item);
  }
}

summary.push(total);

console.log(summary);

对于分组,您可以使用 reduce 函数

angular.module('myApp.view2', [])
  .controller('View2Ctrl', ['$scope', '$filter',
    function($scope, $filter) {

      $scope.securities = ['Preferred Stock', 'Common Stock', 'Options'];

      $scope.transactions = [{
        security: 'Preferred Stock',
        name: 'Robert',
        value: 5,
        date: '2014-1-3'
      }, {
        security: 'Preferred Stock',
        name: 'Robert',
        value: 5,
        date: '2014-1-5'
      }, {
        security: 'Common Stock',
        name: 'Bert',
        value: 20,
        date: '2014-1-6'
      }, {
        security: 'Preferred Stock',
        name: 'Elizabeth',
        value: 10,
        date: '2014-1-6'
      }, {
        security: 'Common Stock',
        name: 'Robert',
        value: 20,
        date: '2014-1-9'
      }, {
        security: 'Preferred Stock',
        name: 'Bert',
        value: 20,
        date: '2014-1-11'
      }, {
        security: 'Preferred Stock',
        name: 'Robert',
        value: 5,
        date: '2014-1-12'
      }, {
        security: 'Preferred Stock',
        name: 'Robert',
        value: 15,
        date: '2014-1-12'
      }, {
        security: 'Options',
        name: 'Bert',
        value: 10,
        date: '2014-1-13'
      }, {
        security: 'Preferred Stock',
        name: 'Robert',
        value: 5,
        date: '2014-1-14'
      }, {
        security: 'Options',
        name: 'Robert',
        value: 15,
        date: '2014-1-17'
      }];

      function addValue(obj, name, el) {

        var group = obj.securities[name],
          result = [];
        if (!group) {
          obj.securities[name] = group = {
            name: name
          };
          result.push(group);
        }
        group[el.security] = (group[el.security] || 0) + el.value;
        group['all'] = (group['all'] || 0) + el.value;

        return result;
      }

      function fixPercent(transactions, total) {
        var totalPercent = 0;
        transactions.forEach(function(el) {
          el.percent = Math.round(100 * el.all / total.all);
          totalPercent += el.percent;
        });

        transactions[transactions.length - 1].percent += 100 - totalPercent;
      }

      var grouppedTransactions = $scope.transactions.reduce(function(acc, el) {
        acc.total = addValue(acc, 'Total', el)[0] || acc.total;
        acc.result = acc.result.concat(addValue(acc, el.name, el));

        return acc;
      }, {
        securities: {},
        result: [],
        total: {}
      });
      $scope.grouppedTransactions = $filter('orderBy')(grouppedTransactions.result, '-all');
      $scope.total = grouppedTransactions.total;
      fixPercent($scope.grouppedTransactions, $scope.total);
    }
  ]);
table,
td,
th {
  border: 1px solid black;
  border-collapse: collapse;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.js"></script>
<div ng-app="myApp.view2" ng-controller="View2Ctrl">
  <table>
    <thead>
      <tr>
        <th>Shareholder</th>
        <th>Preferred Stock</th>
        <th>Common Stock</th>
        <th>Options</th>
        <th>Percentage</th>
      </tr>
    </thead>
    <tbody>
      <tr ng-repeat="sec in grouppedTransactions">
        <td>{{sec.name}}</td>
        <td ng-repeat="secutiry in securities">{{sec[secutiry]}}</td>
        <td>{{sec.percent}}%</td>
      </tr>
    </tbody>
    <tfoot>
      <tr>
        <td>{{total.name}}</td>
        <td ng-repeat="secutiry in securities">{{total[secutiry]}}</td>
        <td>100%</td>
      </tr>
    </tfoot>
  </table>
</div>