$(function () { var data = { Employees: [{ Id: 1, Name: "Employee1", Day: new Date(), Price: 12.54 }, { Id: 2, Name: "Employee2", Day: new Date(), Price: 112.54 }, { Id: 1, Name: "Employee1", Day: new Date(), Price: 12.54 }, { Id: 3, Name: "Employee3", Day: new Date(), Price: 12.54 }] }; var jsonModel = JSON.stringify(data); function employeeModel(data) { var employeeMapping = { 'copy': ["Id", "Name", "Day", "Price"] }; ko.mapping.fromJS(data, employeeMapping, this); } function employeeViewModel(data) { var self = this; self.Employees = ko.observableArray(); self.EmployeeGroups = ko.pureComputed(function () { var employees = self.Employees(), index = {}, group = []; ko.utils.arrayForEach(employees, function(empl) { var id = ko.unwrap(empl.Id); if ( !index.hasOwnProperty(id) ) { index[id] = { grouping: { Id: empl.Id, Name: empl.Name }, items: [] }; group.push(index[id]); } index[id].items.push(empl); }); return group; });
table { border-collapse: collapse; } table, th, td { border: 1px solid black; } tr:nth-child(even) { background-color: #efefef; } tr:nth-child(odd) { background-color: #CCCCCC; } tr.subhead { background-color: #D6E3FF; font-weight: bold; }
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.js"></script> <table> <tbody> <tr class="subhead"> <td colspan="2"> <span data-bind="text: Id"></span> <span data-bind="text: Name"></span> </td> </tr> <tr> <td><span data-bind="text: Day"></span></td> <td><span data-bind="text: Price"></span></td> </tr> </tbody> </table> <pre data-bind="text: ko.toJSON($root, null, 2)" style="font-size: smallest;"></pre>