 <p>At first sight, you could do something like that by inserting a <code>&lt;tbody&gt;</code> (more information here: <a href="http://stackoverflow.com/questions/12979205/angular-js-ng-repeat-across-multiple-trs">Angular.js ng-repeat across multiple tr&#39;s</a>)</p> <p><div class="snippet" data-lang="js" data-hide="false"> <div class="snippet-code"> <pre class="snippet-code-js lang-js prettyprint-override"><code>var myAppModule = angular.module('myApp', []).controller('MyController', MyController); function MyController() { // http://stackoverflow.com/questions/1345939/how-do-i-count-a-javascript-objects-attributes this.objectCount = function(obj) { return Object.keys(obj).length; } this.data = { "10": {}, "12": { "20": { "value": 1, "id": 1, }, "100": { "value": 12, "id": 1, }, "200": { "value": 120, "id": 10, } }, "14": { "100": { "value": 14, "id": 2, } }, "16": {}, "18": {}, "20": { "100": { "value": 23, "id": 1, }, "150": { "value": 56, "id": 3, } }, "22": {}, "24": {} }; }</code></pre> <pre class="snippet-code-css lang-css prettyprint-override"><code>table, th, td { border: 1px solid black; } table { border-collapse: collapse; }</code></pre> <pre class="snippet-code-html lang-html prettyprint-override"><code>&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular.min.js"&gt;&lt;/script&gt; &lt;div ng-app="myApp" ng-controller="MyController as ctrl"&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;type&lt;/th&gt; &lt;th&gt;module&lt;/th&gt; &lt;th&gt;value&lt;/th&gt; &lt;th&gt;id&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody ng-repeat="(row1, value1) in ctrl.data" ng-switch="ctrl.objectCount(value1) === 0"&gt; &lt;tr ng-switch-when="true"&gt; &lt;td&gt;{{row1}}&lt;/td&gt; &lt;td colspan="3"&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr ng-switch-when="false" ng-repeat="(row2, value2) in value1"&gt; &lt;td ng-if="$index === 0" rowspan="{{ctrl.objectCount(value1)}}"&gt; {{row1}} &lt;/td&gt; &lt;td&gt;{{row2}}&lt;/td&gt; &lt;td&gt;{{value2.value}}&lt;/td&gt; &lt;td&gt;{{value2.id}}&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt;</code></pre> </div> </div> </p> <p>If you need something more refined with merging of rows and columns, you should think to build a more oriented view objects, so that the template is simpler, and your business logic is in JavaScript.</p>