Newer
Older
* Cette fonction selectionne les 3 meilleurs films d'une liste de film.
*
* @param {Movie[]} movies - Liste de film.
* @returns {Movie[]} - La liste des 3 films.
*/
function top3(movies) {
let highestNotes = [movies[0], movies[0], movies[0]];
for (let i = 1; i < movies.length; i++) {
if(movies[i].note >= highestNotes[0].note){
highestNotes[2] = highestNotes[1];
highestNotes[1] = highestNotes[0];
highestNotes[0] = movies[i];
}else if(movies[i].note >= highestNotes[1].note){
highestNotes[2] = highestNotes[1];
highestNotes[1] = movies[i];
}else if(movies[i].note >= highestNotes[2].note){
highestNotes[2] = movies[i];
}
}
return highestNotes;
}
/**
* Cette fonction selectionne les 3 meilleurs films pour un utilisateur.
*
* @param {string} user_login - Login de l'utilisateur.
* @returns {Movie[]} - La liste des 3 films.
*/
function recommendationForUser(user_login) {
let person = get_user(user_login);
let fav_styles = []; //styles des films présents dans les films aimés par l'utilisateur
let fav_authors = []; //auteurs récurents dans les films aimés par l'utilisateur : moyenne (auteur * note du film)
let fav_actors = []; //acteurs récurents dans les films aimés par l'utilisateur : moyenne (acteur * note du film (* %temps écran))
//let fav_duration;
let seen = person.movies;
let authors = getAllAuthors(seen).slice(0,3);
for (let i = 0; i < authors.length; i++) {
fav_authors = authors[i][0]; //recuperer seulement l'auteur, pas le reste
}
let actors = getAllElements(seen, getActors).slice(0,3);
for (let i = 0; i < actors.length; i++) {
fav_actors = actors[i][0]; //recuperer seulement l'acteur, pas le reste
}
let styles = getAllElements(seen, getStyles).slice(0,3);
for (let i = 0; i < styles.length; i++) {
fav_styles = styles[i][0]; //recuperer seulement le style, pas le reste
}
let points_films = [[]];
//chaques films a un nombre de points dans chaques catégorie :
//indice 0: films - indice 1: points_auteurs - indice 2: points_acteurs - indice 3: points_styles
}
/**
* trier une matrice par l'indice 1, puis par l'indice 2, puis par l'indice 0.
*
* @param {[string, Number, Number]} a - ligne d'une matrice
* @param {[string, Number, Number]} b - ligne d'une matrice
* @returns {Number} - 1 si a est plus grand, 0 si a=b, -1 si b est plus grand.
*/
function comparerLignes(a, b) {
// trier par le nombre d'apparition de l'auteur dans la liste de film vus (int)
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
// Si le nombre d'apparition est le même, trier par la moyenne de notes des films de l'auteur (float)
if (a[2] < b[2]) return -1;
if (a[2] > b[2]) return 1;
// Si la moyenne est la même, trier par le nom de l'auteur (string)
if (a[0] < b[0]) return -1;
if (a[0] > b[0]) return 1;
// Les lignes sont égales
alert("doublon d'auteur !!");
return 0;
}
/**
* renvoie une liste d'auteurs, avec leur nombre d'apparition dans la liste des films vus par un utilisateur, puis leur note moyenne
*
* @param {Movie[]} movies - Liste de film vus par un utilisateur.
* @returns {[[string, Number, Number]]} - La liste des auteurs.
*/
function getAllAuthors(movies){
let authors = [[]];
//premier indice = couple auteur/nombre d'apparition/moyenne notes films, 2e indice: 0 auteur, 1 nbr apparition, 2 mpyenne films
for (let i = 0; i < seen.length; i++) {
let j = 0;
let found = false;
while(j < authors.length && !found){
if (authors[j][0] == seen[i].author) {
found = true;
authors[j][1] += 1;
authors[j][2] += seen[i].note;
}
j++;
}
if(!found){
authors.append([seen[i].author, 1, seen[i].note]);
}
}
for (let i = 0; i < authors.length; i++) {
authors[i][2] /= authors[i][1];
}
authors.sort(comparerLignes);
return authors;
}
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
* renvoie une liste d'acteurs/styles, avec leur nombre d'apparition dans la liste des films vus par un utilisateur, puis leur note moyenne
*
* @param {Movie[]} movies - Liste de film vus par un utilisateur.
* @param {string(Movie)} recupElement - Fonction qui recupere un element d'un film (pour generaliser à allElement) (acteurs ou styles).
* @returns {[[string, Number, Number]]} - La liste des auteurs.
*/
function getAllElement(movies, recupElement){
let elements = [[]];
//premier indice = couple element/nombre d'apparition/moyenne notes films, 2e indice: 0 auteur, 1 nbr apparition, 2 mpyenne films
for (let i = 0; i < seen.length; i++) {
let j = 0;
let found = false;
temp_elements = recupElement(seen[i]);
for (let h = 0; h < temp_elements.length; h++) {
while(j < elements.length && !found){
if (elements[j][0] == recupElement(temp_elements[h])) {
found = true;
elements[j][1] += 1;
elements[j][2] += temp_elements[h].note;
}
j++;
}
if(!found){
elements.append([recupElement(temp_elements[h]), 1, temp_elements[h].note]);
}
}
}
for (let i = 0; i < elements.length; i++) {
elements[i][2] /= elements[i][1];
}
elements.sort(comparerLignes);
return elements;
/*function getAuthor(movie){
return movie.author;
}*/
function getActors(movie){
return movie.actors;
}
function getStyles(movie){
return movie.styles;
}