Dziennik krok 3: tablica obiektów i metody tablic
Projekt: dziennik ocen krok po kroku - JavaScript od podstaw: konsola (JavaScript)
Zamiast liczyć sumy w trakcie czytania, program najpierw zamienia cały tekst na tablicę obiektów (`map(parseLine)`), a potem z niej liczy. `groupBy` grupuje oceny według dowolnego pola (`'name'` albo `'subject'`), więc jedna funkcja obsługuje uczniów i przedmioty. Średnia to `reduce`, najlepszy uczeń też. Dane i obliczenia są teraz rozdzielone. Wynik nadal ten sam.
const DATA = `Ola;matematyka;5
Jan;matematyka;3
Ola;polski;4
Ewa;matematyka;6
Jan;polski;2
Ewa;polski;5
Ola;matematyka;6
Jan;matematyka;4`;
function parseLine(line) {
const [name, subject, grade] = line.split(';');
return { name, subject, grade: Number(grade) };
}
function groupBy(records, key) {
const groups = {};
for (const r of records) {
if (!(r[key] in groups)) groups[r[key]] = [];
groups[r[key]].push(r.grade);
}
return groups;
}
function average(grades) {
return grades.reduce((a, b) => a + b, 0) / grades.length;
}
const records = DATA.split('\n').map(parseLine);
const byName = groupBy(records, 'name');
console.log('Uczniowie:');
for (const [name, grades] of Object.entries(byName)) {
console.log(`${name}: ${average(grades).toFixed(2)}`);
}
console.log('Przedmioty:');
for (const [subject, grades] of Object.entries(groupBy(records, 'subject'))) {
console.log(`${subject}: ${average(grades).toFixed(2)} (ocen: ${grades.length})`);
}
const [bestName, bestGrades] = Object.entries(byName).reduce(
(best, entry) => (average(entry[1]) > average(best[1]) ? entry : best),
);
console.log(`Najlepsza średnia: ${bestName} (${average(bestGrades).toFixed(2)})`);Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.
Wszystkie lekcje kursu JavaScript od podstaw: konsola·Zaloguj się, aby zapisać postęp na koncie.