JSFiddle - React, Tailwind, and code Playground

HTML

<div id=results>
    <div data-bind="text: elapsed"></div>
    <table border>
    <thead>
        <tr data-bind="foreach: columnLabels">
            <td data-bind="text: label"></td>
        </tr>
    </thead>
    <tbody data-bind="foreach: results">
        <tr data-bind="foreach: $root.columnLabels">
            <td data-bind="text: $parent[id]"></td>
        </tr>
    </tbody>
    </table>
</div>

CSS

table {
    border-collapse: collapse;
}

th, td {
    padding: 1em;
}

JavaScript

var viewModel = {
    columnLabels: ko.observableArray([
        {id: 'a', label: 'Column A'},
        {id: 'b', label: 'Column B'},
        {id: 'c', label: 'Column C'},
        {id: 'd', label: 'Column D'},
    ]),
    results: ko.observableArray(),
    elapsed: ko.observable(0)
};

for (var i = 1; i <= 3000; i++)
    viewModel.results.push({ a: 'A' + i, b: 'B' + i, c: 'C' + i, d: 'D' + i });

var start = new Date().getTime();
ko.applyBindings(viewModel, document.getElementById('results'));
viewModel.elapsed((new Date().getTime() - start)/1000 + 'ms');