var n = 8; //размер доски
var chessBoardTable = document.getElementById('chessBoard'); //элемент страницы
var rows = _.chain(n).range().map(function(i) {
return {
cells: _.range(n)
};
}).value();
// chain - объявление цепочки последовательных действий, передаётся аргумент для первого действия цепочки. для последующих действий аргументом будет являться результат предыдущего действия
// range - получение диапазона (массива) чисел заданной длины
// map - сопостовление элемента массива другому элементу, полученному на основе первого
// возвращаем для каждого индекса строки объект содержащий свойство cells являющийся диапазоном чисел от 0 до N - 1
// value - получение результата последнего действия цепочки
var viewModel = {
rows: rows
}; //модель для предстваления таблицы N x N
ko.applyBindings(viewModel, chessBoardTable); //назначение объекта viewModel в качестве контекста для элемента таблицы
<table id="chessBoard">
<!--data-bind аттрибут содержащий объект, описывающий правила формирования внутреннего контента элемента-->
<tbody data-bind="foreach: rows">
<!--в данном случае используется foreach, для повторения разметки описанной внутри элемента для каждого элемента массива-->
<tr data-bind="foreach: cells">
<td>
<div></div>
</td>
</tr>
</tbody>
</table>
tr:nth-child(odd) > td:nth-child(odd) {
background-color: black;
}
tr:nth-child(odd) > td:nth-child(even) {
background-color: white;
}
tr:nth-child(even) > td:nth-child(odd) {
background-color: white;
}
tr:nth-child(even) > td:nth-child(even) {
background-color: black;
}
td > div {
min-height: 20px;
min-width: 20px;
}
External resources loaded into this fiddle: