perhaps use computed and if binding for group headers ....
$(document).ready(function () {
function ReportingViewModel(){
var self = this;
self.results= ko.observableArray([{'source': '00234','total':'4506','division':'div1'},
{'source': '30222','total':'456','division':'div2'},
{'source': '63321','total':'23','division':'div2'},
{'source': '40941','total':'189','division':'div1'}]);
self.groupedResults = {};
self.getGroup = function(group){
return self.groupedResults[group];
};
self.groupedResultsC = ko.computed(function(){
self.groupedResults = {};
ko.utils.arrayForEach( self.results(),function(r){
if(!self.groupedResults[r.division]) self.groupedResults[r.division] = [];
self.groupedResults[r.division].push(r);
});
return self.groupedResults;
});
self.groups = ko.computed(function(){
var g = [];
for(x in self.groupedResultsC())
g.push(x);
return g;
});
}
model = new ReportingViewModel();
ko.applyBindings(model);
});
</script>
<body>
<tbody data-bind="foreach: groups" >
<!-- ko foreach: $root.getGroup($data) -->
<tr data-bind="if: $index() == 0"><td colspan="3" data-bind="text: division"></td></tr>