<!DOCTYPE html>
<html ng-app="app">

  <head>
    <script data-require="angular.js@*" data-semver="1.3.1" src="//code.angularjs.org/1.3.1/angular.js"></script>
    <script src="script.js"></script>
    <style>
      .container1 {
        width : 45%;
        float : left;
        margin-right : 50px;
      }
      .container2{
        width : 45%;
        float : left;
        
      }
      .table{
        width : 100%;
        border-collapse : collapse;
      }
      .table td, .table th {
        border : 1px solid black;
        padding : 5px;
        margin : 0px;
      }
      .groupHeader{
        padding: 3px;
        margin : 3px;
      }
      .groupValue{
        padding : 2px 20px;
      }
      
    </style>
  </head>

  <body ng-controller="groupByCtrl">
  <div class="container1">
    <h4>Before applying group by filter</h4>
    <table class="table">
      <thead>
        <th>Name</th>
        <th>Country</th>
      </thead>
      <tr ng-repeat="detail in playerDetails track by $index">
        <td>{{detail.name}}</td>
        <td>{{detail.country}}</td>
      </tr>
    </table>
  </div>
  <div class="container2">
    <h4>After applying Group By filter</h4>
    <div ng-repeat="detail in playerDetails | groupBy:'country'">
			<h4 class="groupHeader" ng-show="detail.group_by_key">{{detail.country}}</h4>
			<span class="groupValue">{{detail.name}}</span>	
		</div>
  </div>
  </body>

</html>
var app = angular.module("app",[]);

app.controller("groupByCtrl",["$scope",function($scope){
  console.log("inside df");
  $scope.playerDetails = [{"name":"MS Dhoni","country":"India"},
      {"name":"JE Root","country":"England"},{"name":"GJ Maxwell","country":"Australia"},
      {"name":"V Kohli","country":"India"},{"name":"SP Narine","country":"West Indies"},
      {"name":"KP Pietersen","country":"England"},{"name":"JP Faulkner","country":"Australia"},
      {"name":"B Kumar","country":"India"},{"name":"KA Pollard","country":"West Indies"},
      {"name":"GJ Bailey","country":"Australia"},{"name":"CH Gayle","country":"West Indies"},
      {"name":"JM Anderson","country":"England"},{"name":"RA Jadeja","country":"India"}];
}]);

app.filter("groupBy",["$parse","$filter",function($parse,$filter){
  return function(array,groupByField){
    var result	= [];
            var prev_item = null;
            var groupKey = false;
            var filteredData = $filter('orderBy')(array,groupByField);
            for(var i=0;i<filteredData.length;i++){
              groupKey = false;
              if(prev_item !== null){
                if(prev_item[groupByField] !== filteredData[i][groupByField]){
                  groupKey = true;
                }
              } else {
                groupKey = true;  
              }
              if(groupKey){
                filteredData[i]['group_by_key'] =true;  
              } else {
                filteredData[i]['group_by_key'] =false;  
              }
              result.push(filteredData[i]);
              prev_item = filteredData[i];
            }
            return result;
  }
}])
/* Styles go here */