Search code examples
javascriptangularjsloopsrecursion

AngularJS : table colspan rowspan dynamic calculation


I have JSON structure like below each contains Title and SubColumns. Subcolumns may or may not have extra SubCloumns.

From that I want to generate table Heading so I need to calculate ColSpan and RowSpan accordingly.

Calculate colspan and rowspan

What I know is have to use recursion, I have tried but as I'm new I can't figure out how it will works.

So can any one guide me how will I use a recursive function?

[
   {
      "Title":"Column 1",
      "SubColumns":[

      ]
   },
   {
      "Title":"Column 2",
      "SubColumns":[

      ]
   },
   {
      "Title":"Column 3",
      "SubColumns":[
         {
            "Title":"Column 3 : 1",
            "SubColumns":[

            ]
         },
         {
            "Title":"Column 3 : 2",
            "SubColumns":[
               {
                  "Title":"Column 3 : 2 : 1",
                  "SubColumns":[

                  ]
               },
               {
                  "Title":"Column 3 : 2 : 2",
                  "SubColumns":[

                  ]
               },
               {
                  "Title":"Column 3 : 2 : 3",
                  "SubColumns":[

                  ]
               },
               {
                  "Title":"Column 3 : 2 : 4",
                  "SubColumns":[

                  ]
               }
            ]
         },
         {
            "Title":"Column 3 : 3",
            "SubColumns":[
               {
                  "Title":"Column 3 : 3 : 1",
                  "SubColumns":[

                  ]
               },
               {
                  "Title":"Column 3 : 3 : 2",
                  "SubColumns":[

                  ]
               },
               {
                  "Title":"Column 3 : 3 : 3",
                  "SubColumns":[

                  ]
               }
            ]
         }
      ]
   }
]

Solution

  • angular.module('myapp', []).controller('tableColSpanRowSpan', ['$scope', function($scope){
    
            $scope.finalArrayHTML = [];
    
            var jsonDATA = [
                {
                    "Title":"Column 1",
                    "SubColumns":[
    
                    ]
                },
                {
                    "Title":"Column 2",
                    "SubColumns":[
    
                    ]
                },
                {
                    "Title":"Column 3",
                    "SubColumns":[
                        {
                            "Title":"Column 3 : 1",
                            "SubColumns":[
    
                            ]
                        },
                        {
                            "Title":"Column 3 : 2",
                            "SubColumns":[
                                {
                                    "Title":"Column 3 : 2 : 1",
                                    "SubColumns":[
    
                                    ]
                                },
                                {
                                    "Title":"Column 3 : 2 : 2",
                                    "SubColumns":[
    
                                    ]
                                },
                                {
                                    "Title":"Column 3 : 2 : 3",
                                    "SubColumns":[
    
                                    ]
                                },
                                {
                                    "Title":"Column 3 : 2 : 4",
                                    "SubColumns":[
    
                                    ]
                                }
                            ]
                        },
                        {
                            "Title":"Column 3 : 3",
                            "SubColumns":[
                                {
                                    "Title":"Column 3 : 3 : 1",
                                    "SubColumns":[
    
                                    ]
                                },
                                {
                                    "Title":"Column 3 : 3 : 2",
                                    "SubColumns":[
    
                                    ]
                                },
                                {
                                    "Title":"Column 3 : 3 : 3",
                                    "SubColumns":[
    
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ];
    
            var getColSpan = function(data, count) {
                if(data.length > 0) {
                    for(var c = 0; c < data.length; c++) {
                        if(data[c].SubColumns.length > 0) {
                            count = getColSpan(data[c].SubColumns, count);
                        } else {
                            ++count;
                        }
                    }
    
                }
                return count;
            };
    
            var getDepth = function (obj) {
                var depth = 0;
                if (obj.SubColumns) {
                    obj.SubColumns.forEach(function (d) {
                        var tmpDepth = getDepth(d)
                        if (tmpDepth > depth) {
                            depth = tmpDepth
                        }
                    })
                }
                return 1 + depth
            };
    
            var getRowSpan = function(allData, index, count) {
                if(allData[index].SubColumns.length > 0) {
    
                } else {
                    var depth = 0;
                    for(var j = 0; j < allData.length; j++) {
                        var depthTmp = getDepth(allData[j]);
                        if(depthTmp > depth) {
                            depth = depthTmp;
                        }
                    }
                    return depth;
                }
                return count;
            };
    
            var rowIndex = 0;
            var RecursiveFunction = function(data, currentRow) {
    
                for(var i = 0; i < data.length; i++) {
                    var tmp = {title: data[i].Title, colSpan: getColSpan(data[i].SubColumns, 0), rowSpan: getRowSpan(data, i, 0)};
                    if(typeof $scope.finalArrayHTML[rowIndex] == 'undefined') {
                        $scope.finalArrayHTML[rowIndex] = [];
                    }
                    $scope.finalArrayHTML[rowIndex].push(tmp);
    
                    if(data[i].SubColumns.length > 0) {
                        ++rowIndex;
                        RecursiveFunction(data[i].SubColumns, data[i]);
                        --rowIndex;
                    }
                }
    
            };
    
            RecursiveFunction(jsonDATA, 0);
    
        }]);
    <!doctype html>
    <html ng-app="myapp">
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js"></script>
    </head>
    <body>
    
    <div ng-controller="tableColSpanRowSpan">
        <table border="1" cellspacing="2" cellpadding="3">
            <thead>
            <tr data-ng-repeat="t in finalArrayHTML">
                <th colspan="{{h.colSpan}}" rowspan="{{h.rowSpan}}" data-ng-repeat="h in t">{{h.title}}</th>
            </tr>
            </thead>
        </table>
    </div>
    
    </body>
    </html>