Вот как вы можете сделать это, зацикливаясь на каждом ученике, а затем на каждом задании.
Сначала я создаю двумерный массив, заполненный 0
, имеющий столько строк, сколько учеников и столько столбцовтак как есть назначения:
const assignArr = Array.from({ length: assignments }, (_, i) => 0);
const studentsArr = Array.from({ length: students }, (_, i) => [...assignArr]);
Затем вы используете два цикла, чтобы заполнить этот массив случайными неделями.Для каждого студента вы инициализируете доступные недели в начале цикла и передаете этот массив в getRandomWeeks()
, который удаляет случайную неделю из массива, чтобы вы не повторяли их для каждого студента:
for (let student = 0; student < students; ++student) {
const weeks = Array.from({ length: duration }, (_, i) => i);
for (let work = 0; work < assignments; ++work) {
studentsArr[student][work] = getRandomWeek(weeks) + 1;
}
studentsArr[student].sort((a, b) => a - b);
}
function getRandomWeek(weeks) {
const weekIdx = Math.floor(Math.random() * weeks.length);
return weeks.splice(weekIdx, 1).shift();
}
Затем вы просто вызываете вспомогательную функцию для генерации таблицы.Вот полная демонстрация.Вы можете отредактировать поля формы и посмотреть обновление таблицы:
function update() {
const form = document.getElementById('form');
const duration = form.elements['weeks'].value;
const students = form.elements['students'].value;
const assignments = form.elements['assignments'].value;
const assignArr = Array.from({ length: assignments }, (_, i) => 0);
const studentsArr = Array.from({ length: students }, (_, i) => [...assignArr]);
for (let student = 0; student < students; ++student) {
const weeks = Array.from({ length: duration }, (_, i) => i);
for (let work = 0; work < assignments; ++work) {
studentsArr[student][work] = getRandomWeek(weeks) + 1;
}
studentsArr[student].sort((a, b) => a - b);
}
makeTable(studentsArr);
}
function getRandomWeek(weeks) {
const weekIdx = Math.floor(Math.random() * weeks.length);
return weeks.splice(weekIdx, 1).shift();
}
function makeTable(data) {
const header = document.querySelector('#table thead tr');
header.innerHTML = '';
for (let i = 0; i < data[0].length + 1; ++i) {
const colEl = document.createElement('th');
colEl.textContent = i === 0 ? 'Assignments' : `#${i}`;
header.appendChild(colEl);
}
const tbody = document.querySelector('#table tbody');
tbody.innerHTML = '';
data.forEach((row, i) => {
const rowEl = document.createElement('tr');
const col0 = document.createElement('td');
col0.textContent = `Student #${i + 1}`;
rowEl.appendChild(col0);
for (let col of row) {
const colEl = document.createElement('td');
colEl.textContent = col;
rowEl.appendChild(colEl);
}
tbody.appendChild(rowEl);
});
}
update();
table {
margin: 10px;
border-collapse: collapse;
text-align: center;
}
td, th {
border: 1px solid black;
padding: 3px;
}
<form id="form">
Weeks <input type="number" name="weeks" value=12 onchange="update()">
Students <input type="number" name="students" value=10 onchange="update()">
Assignments <input type="number" name="assignments" value=5 onchange="update()">
</form>
<table id="table">
<thead>
<tr>
</tr>
</thead>
<tbody>
</tbody>
</table>