Progettare e gestire, in JavaScript ES6, una semplice struttura dati composta da un oggetto Question e da un array di oggetti Answer, sfruttando costruttori, proprietà/metodi degli oggetti e metodi funzionali sugli array per la ricerca, il filtraggio e l’ordinamento delle risposte.
Answer
Question
add(answer) → inserisce l’oggetto Answer nell’array.find(username) → restituisce, con Array.filter( ), le risposte dell’utente indicato.afterDate(date) → restituisce, con Array.filter( ), le risposte aventi data successiva al parametro.listByDate() → restituisce una copia dell’array, ordinata in ordine crescente di data tramite Array.slice( ) + Array.sort( ).listByScore() → come sopra ma ordinata in ordine decrescente di score.Question con quattro Answer di prova.'use strict';
/* --- Costruttore di Answer --- */
function Answer(text, username, score, date) {
this.text = text;
this.username = username;
this.score = score;
this.date = date; // istanza di Date
}
/* --- Costruttore di Question --- */
function Question(question, questioner, date) {
this.question = question;
this.questioner = questioner;
this.date = date;
this.answers = []; // array vuoto in partenza
}
/* Aggiunge una risposta */
Question.prototype.add = function(answer) {
this.answers.push(answer);
};
/* Trova tutte le risposte di un utente */
Question.prototype.find = function(username) {
return this.answers.filter(a => a.username === username);
};
/* Risposte dopo una certa data */
Question.prototype.afterDate = function(date) {
return this.answers.filter(a => a.date >= date);
};
/* Elenco per data crescente */
Question.prototype.listByDate = function() {
return this.answers
.slice() // copia
.sort((a, b) => a.date - b.date); // .sort()
};
/* Elenco per punteggio decrescente */
Question.prototype.listByScore = function() {
return this.answers
.slice()
.sort((a, b) => b.score - a.score);
};
/* ---------- Esempio d'uso ---------- */
const q1 = new Question(
'Qual è il miglior metodo per studiare JavaScript',
'alice',
new Date('2025-06-01')
);
q1.add(new Answer('Fare molta pratica', 'bob', 5, new Date('2025-06-02')));
q1.add(new Answer('Leggere la documentazione MDN', 'carol', 7, new Date('2025-06-03')));
q1.add(new Answer('Seguire i video-tutorial', 'dave', 1, new Date('2025-06-04')));
q1.add(new Answer('Partecipare a progetti open source', 'bob', 3, new Date('2025-06-05')));
console.log('- Risposte di bob -');
console.table(q1.find('bob'));
console.log('- Dopo il 3 giugno -');
console.table(q1.afterDate(new Date('2025-06-03')));
console.log('- Ordinamento per data -');
console.table(q1.listByDate());
console.log('- Ordinamento per score -');
console.table(q1.listByScore());
listByDate() e listByScore() restituiscono una copia (slice()) per non alterare lo stato interno (answers) e garantire l’incapsulamento.> utilizza il valore numerico interno di Date; per applicazioni reali conviene adottare librerie dedicate (es. Day.js) per gestire fusi orari e formattazioni.add() sia un’istanza corretta di Answer; in sistemi reali occorre introdurre controlli di tipo e gestione degli errori.sort() su copie è irrilevante, ma per volumi elevati può essere opportuno mantenere strutture indicizzate o cache degli ordinamenti.