code.js tri.js : : enregistrement initial

This commit is contained in:
Jean-Christophe Engel 2024-06-07 13:43:54 +02:00
parent a2ab8bd9ea
commit d3361281cd
2 changed files with 531 additions and 0 deletions

301
code.js Normal file
View File

@ -0,0 +1,301 @@
// ------------------------------------------------------------------------
// fabriquer une chaine aléatoire
const chaine = (length) => {
let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàâäéèêëîïôöûüùÀÂÄÉÈÊËÎÏÔÖÛÜÙ';
let str = '';
for (let i = 0; i < length; i++) {
str += chars.charAt(Math.floor(Math.random() * chars.length));
}
return str;
}
// renvoyer une chaine
return chaine(10)
// renvoyer un tableau de chaines
for (let i = 0; i < 3 + Math.floor(Math.random() * 5); ++i) {
${lesnoms} = ${lesnoms}.concat(chaine(10));
}
return ${lesnoms}; // => lesnoms
// ------------------------------------------------------------------------
// fabriquer chaîne avec nom prénom
const upper = (str) => {
return str.charAt(0).toUpperCase() + str.slice(1);
};
const chaine = (length) => {
let chars = 'aàbcdeéèfghijklmnoôpqrstuùvwxyz';
let str = '';
for (let i = 0; i < length; i++) {
str += chars.charAt(Math.floor(Math.random() * chars.length));
}
let debut = upper(str.slice(0, length/2));
let fin = upper(str.slice(length/2));
return debut + ' ' + fin;
};
for (let i = 0; i < 7 + Math.floor(Math.random() * 15); ++i) {
${lesnoms} = ${lesnoms}.concat(chaine(11 + Math.floor(Math.random() * 5)));
}
return ${lesnoms};
// fabriquer adresse courriel
const chaine = (length) => {
let chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
let str = '';
for (let i = 0; i < length; i++) {
str += chars.charAt(Math.floor(Math.random() * chars.length));
}
return str;
};
return chaine(8) + "@ici.fr";
// code postal
return Math.random().toString(10).substring(2, 7);
// numéro téléphone
return '0' + Math.random().toString(10).substring(2, 11);
// supprimer espace dans numéro téléphone
return ${telephone}.replace(/\\s/g, "")
// ------------------------------------------------------------------------
// Calculer date réelle à partir d'une date saisie même bizarre
// ex: 95/31/2020 => 03/10/2022
function joursMois (annee, mois) {
return new Date(annee, mois, 0).getDate();
}
function getDate(chaine) {
var ds = chaine.split('/');
var jour=ds[0];
var an = Math.floor(ds[1]/12);
var annee = Number(ds[2]) + an;
var mois = ds[1] - 12 * an;
var dm = joursMois(annee, mois);
while (jour > dm) {
jour -= dm;
++mois;
if (mois > 12) { mois = 1; ++annee; }
dm = joursMois(annee, mois);
}
if (jour < 10) { jour = '0' + jour; }
if (mois < 10) { mois = '0' + mois; }
return(jour + '/' + mois + '/' + annee);
}
return getDate(${date});
// ------------------------------------------------------------------------
// rendre visibles les options de filtres de membre
var nav = document.querySelector(".dropdown");
var li = nav.querySelectorAll("li");
for (const l of li) { l.style.display="block"; }
return;
// ------------------------------------------------------------------------
// vérifier la validité d'une date au format JJ/MM/AAAA
// 1. séparer une date JJ/MM/AAAA selon les /
return ${ds}.split('/') // => ts
// 2. faire une date au format MM-DD-YYYY
return ${ts}[1] + '-' + ${ts}[0] +'-' + ${ts}[2] // => dd
// 3. vérifier si on peut créer une date valide
return ! isNaN(Date.parse(${dd})) // => ok
// ------------------------------------------------------------------------
// créer un tableau d'objets {numéro, catégorie}
// le trier par numéro
// renvoyer le tableau des catégories
let tab = [];
for (let i = 0; i < ${lesnumeros}.length; ++i)
{
let o = Object();
o.num=${lesnumeros}[i];
o.cat=${lescategories}[i];
tab.push(o);
}
// trier
tab.sort((a, b) => {
return a.num - b.num;
});
// catégories
let categs = [];
tab.forEach((e) => {
categs.push(e.cat);
});
return categs;
// ------------------------------------------------------------------------
// renvoyer le numéro d'une catégorie donnée
// params :
// - nom d'une catégorie
// - tableau des catégories classé par numéro croissant
function getNumero(cat_name, categories) {
let i = 0;
while (i < categories.length) {
if (categories[i] == cat_name) { return i + 1; }
i += 1;
}
}
return getNumero(${categorie}, ${categories_num});
// ------------------------------------------------------------------------
// trier les membres : voir tri.js
// ------------------------------------------------------------------------
// sélectionner un parent parmi les nb premiers éléments du tableau
// lesnoms
function selParent(lesnoms, lesparents, nb)
{
while(true) {
let num = Math.floor(Math.random() * nb);
if (lesparents[num].length == 0) { return lesnoms[num]; }
}
}
return selParent(${lesnoms}, ${lesparents}, ${i})
// trier les membres selon le parent
// critères :
// - id_parent IS NULL
// - nom_parent
// - nom_membre
// - numero
function trierParents(tparents, tnoms, tnumeros, croissant = true)
{
let tab = [];
for (let i = 0; i < tnumeros.length; ++i) {
let o = Object();
o.numero = tnumeros[i];
o.nom = tnoms[i];
o.parent = tparents[i];
tab.push(o);
}
tab.sort((a, b) => {
if (! croissant) { [a, b] = [b, a]; }
let comp = a.parent.localeCompare(b.parent);
if (comp == 0) { comp = a.nom.localeCompare(b.nom); }
if (comp == 0) { comp = a.numero - b.numero; }
return comp;
});
/*
if (a.parent === "") {
if (b.parent === "") {
// deux parents vides => comparer les noms
return a.nom.localeCompare(b.nom);
}
else {
return 1;
}
}
else {
if (b.parent === "") {
return -1;
}
else {
// deux parents non vides => comparer les noms
let comp = a.parent.localeCompare(b.parent);
if (comp == 0) {
comp = a.nom.localeCompare(b.nom);
}
return comp;
}
}
});
*/
return tab;
}
let tab = trier(${lesnumeros}, ${lesnoms}, ${lesparents});
let resu = [];
tab.forEach((e) => {
resu.push(e.nom);
});
return resu;
// ------------------------------------------------------------------------
// normaliser une chaîne :
// - mettre en minuscules
// - remplacer les caractères avec accent par leur équivalent sans accent
// ------------------------------------------------------------------------
const accent = "àâäéèêëîïôöùûü";
const normal = "aaaeeeeiioouuu";
function normaliser (chaine) {
let resu = "";
chaine = chaine.toLocaleLowerCase();
for (let i = 0; i < chaine.length; ++i) {
let ind = accent.indexOf(chaine[i]);
if (ind == -1) {
resu += chaine[i];
} else {
resu += normal[ind];
}
}
return resu;
}
// const donnee = "Aèzfoj Rdùxiè";
// let resu = normaliser(donnee.toLocaleLowerCase());
// console.log("donnée = " + donnee + "\nresu = " + resu);
// ------------------------------------------------------------------------
// compter le nb d'occurences d'un élément dans un tableau de chaines
// ------------------------------------------------------------------------
function nbocc(elem, tab) {
let nb = 0;
for (const e of tab) {
if (normaliser(e).localeCompare(elem) == 0) { nb += 1; }
}
return nb;
}
//return nbocc(${nom}.toLocaleLowerCase(), ${lesnoms})
// ------------------------------------------------------------------------
// renvoyer un nom au hasard d'un tableau en s'assurant qu'il n'a pas
// d'homonyme après normalisation
// ------------------------------------------------------------------------
function getNom(tab) {
while (true) {
let nom = tab.at(Math.floor(Math.random() * tab.length));
let nb = nbocc(normaliser(nom), tab);
if (nb == 1) { return nom; }
}
}
return getNom(${lesnoms})
// ------------------------------------------------------------------------
// vérifier qu'une chaine est présente dans un nom normalisé
// ------------------------------------------------------------------------
function verif(chaine, nom) {
return normaliser(nom).includes(chaine);
}
// ------------------------------------------------------------------------
// faire un tableau des « homonymes » de chaine
// ------------------------------------------------------------------------
function homonymes(chaine, tab) {
let homos = []
for (const e of tab) {
if (normaliser(e).includes(chaine)) {
homos.push(e);
}
}
return homos;
}
// idem en renvoyant les indices
function indonymes(chaine, tab) {
let homos = [];
for (let i = 0 ; i < tab.length; ++i) {
if (normaliser(tab[i]).includes(chaine)) {
homos.push(i);
}
}
return homos;
}

230
tri.js Normal file
View File

@ -0,0 +1,230 @@
// trier par nom puis par numéro
function trierNoms(tnoms, tnumeros, croissant = true)
{
let tab = [];
for (let i = 0; i < tnoms.length; ++i)
{
let o = Object();
o.nom = tnoms[i];
o.numero = tnumeros[i];
tab.push(o);
}
tab.sort((a, b) => {
if (! croissant) { [a, b] = [b, a]; }
let comp = a.nom.localeCompare(b.nom);
if (comp == 0) { comp = a.numero - b.numero; }
return comp;
});
return tab;
}
// extraire le tableau des noms d'un tableau d'objets trié
function extraireNoms(tab)
{
let noms = [];
tab.forEach((e) => {
noms.push(e.nom);
});
return noms;
}
// afficher un tableau
function afficher(msg, tab)
{
console.log("\n" + msg);
for (let i = 0; i < tab.length; ++i)
{
console.log(tab[i]);
}
}
// trier par ville puis par numéro
// ville (dé)croissant, numéro (dé)croissant
// ville vide en fin(début), numéro (dé)croissant
function trierVilles(tvilles, tnumeros, croissant = true)
{
let tab = [];
for (let i = 0; i < tvilles.length; ++i)
{
let o = Object();
o.ville = tvilles[i];
o.numero = tnumeros[i];
tab.push(o);
}
tab.sort((a, b) => {
if (! croissant) { [a, b] = [b, a]; }
// une ville au moins vide ?
if (a.ville == "" && b.ville == "") { return a.numero - b.numero; }
if (a.ville == "") { return 1; }
if (b.ville == "") { return -1;}
// deux villes non vides
let comp = a.ville.localeCompare(b.ville);
if (comp == 0) { comp = a.numero - b.numero; }
return comp;
});
return tab;
}
// extraire le tableau des villes d'un tableau d'objets trié
function extraireVilles(tab)
{
let villes = [];
tab.forEach((e) => {
villes.push(e.ville);
});
return villes;
}
// trier les membres selon le parent
// - parent (dé)croissant, nom membre (dé)croissant, numéro (dé)croissant
// - parent vide à la fin, nom membre (dé)croissant, numéro (dé)croissant
function trierParents(tparents, tnoms, tnumeros, croissant = true)
{
let tab = [];
for (let i = 0; i < tnumeros.length; ++i) {
let o = Object();
o.numero = tnumeros[i];
o.nom = tnoms[i];
o.parent = tparents[i];
tab.push(o);
}
tab.sort((a, b) => {
ordre = croissant ? 1 : -1;
// un parent au moins est vide ?
if (a.parent == "" && b.parent == "") {
let comp = a.nom.localeCompare(b.nom);
if (comp == 0) { comp = a.numero - b.numero; }
return comp * ordre;
}
if (a.parent == "") { return 1; }
if (b.parent == "") { return -1; }
// deux parents non vides
let comp = a.parent.localeCompare(b.parent);
if (comp == 0) { comp = a.nom.localeCompare(b.nom); }
if (comp == 0) { comp = a.numero - b.numero; }
return comp * ordre;
});
return tab;
}
// trier les membres selon la colonne responsable
// - non vide au début, nom membre (dé)croissant, numéro (dé)croissant
// - vide à la fin, nom membre (dé)croissant, numéro (dé)croissant
function trierResp(tresp, tnoms, tnumeros, croissant = true)
{
let tab = [];
for (let i = 0; i < tnumeros.length; ++i) {
let o = Object();
o.numero = tnumeros[i];
o.nom = tnoms[i];
o.resp = tresp[i];
tab.push(o);
}
tab.sort((a, b) => {
ordre = croissant ? 1 : -1;
// un resp au moins est vide ?
if (a.resp == "" && b.resp == "") {
let comp = a.nom.localeCompare(b.nom);
if (comp == 0) { comp = a.numero - b.numero; }
return comp * ordre;
}
if (a.resp == "") { return 1; }
if (b.resp == "") { return -1; }
// deux resp non vides
let comp = a.resp.localeCompare(b.resp);
if (comp == 0) { comp = a.nom.localeCompare(b.nom); }
if (comp == 0) { comp = a.numero - b.numero; }
return comp * ordre;
});
return tab;
}
// ------------------------------------------------------------------------
// les données et les tests
// ------------------------------------------------------------------------
const tnumeros = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
121, 122, 123
];
const tnoms = [
"Lambert Paul", "Sjqeaz Njguqô", "Gfjkms Ôfyike", "Xnunèp Tmhàxz", "Xhràèk Ùmunyv",
"Jgévxù Wohyrv", "Mèkixt Ùyimtd", "Zhamberlain Luuc", "Ézhaée Ùùpwab", "Éàkhhô Psyauà",
"Lambert Paul", "Zphjéà Irôezqé", "Mpùuky Blégmmz", "Htôtkl Sxgtrô", "Kcfyè Nsvmvq",
"Hdzcpèn Rddpdafx", "Èàrgkx Idèpoù", "Rhocry Dlùvwpq", "Ziùcwe Hpqltrs", "Brkcàg Nigcyi",
"Jtinjôù Wmwiônj", "Cylsx Nzoèwl", "Éxiqnh Fcbwizà"
];
const tvilles = [
"", "Erawvcyfézgrfoi", "Jbqmqeyemdbstcf", "Ùhkfwuvgpcuèùqa", "Yécewxefmepôàeé",
"La Havane", "Fyàwxsbedwanxqt", "", "Sipkàoféuslgiiu", "Psôhègébulaùdzm",
"Pioùôutôeyytùlà", "", "", "", "",
"", "", "", "La Havane", "", "", "La Havane", ""
];
const parents = [
"", "", "", "", "",
"", "Jgévxù Wohyrv", "", "Zhamberlain Luuc", "",
"", "", "", "Xhràèk Ùmunyv", "Xnunèp Tmhàxz",
"", "Jgévxù Wohyrv", "", "Zhamberlain Luuc", "Gfjkms Ôfyike",
"Sjqeaz Njguqô", "Jgévxù Wohyrv", "Sjqeaz Njguqô"
];
const tresp = [
"", "Oui", "Oui", "Oui", "Oui",
"Oui", "", "Oui", "", "",
"", "", "", "", "",
"", "", "", "", "",
"", "", ""
];
// console.log("p.l = " + parents.length + ", nom.l = " + tnoms.length + ", num.l = " + tnumeros.length + ", r.l = " + resp.length);
// trier par nom croissant puis décroissant
let tab_noms = trierNoms(tnoms, tnumeros);
afficher("Tri par nom croissant :", tab_noms);
// let tnoms_trie = extraireNoms(tab_noms);
// afficher("Tableau de noms trié en ordre croissant", tnoms_trie);
tab_noms = trierNoms(tnoms, tnumeros, false);
afficher("Tri par nom décroissant :", tab_noms);
// tnoms_trie = extraireNoms(tab_noms);
// afficher("Tableau de noms trié en ordre décroissant", tnoms_trie);
// trier par ville croissante puis décroissante
let tab_villes = trierVilles(tvilles, tnumeros);
afficher("Tri par ville croissant :", tab_villes);
// let tvilles_trie = extraireVilles(tab_villes);
// afficher("Tableau de villes trié en ordre croissant", tvilles_trie);
tab_villes = trierVilles(tvilles, tnumeros, false);
afficher("Tri par ville décroissant :", tab_villes);
// tvilles_trie = extraireVilles(tab_villes);
// afficher("Tableau de villes trié en ordre décroissant", tvilles_trie);
// trier par parent croissant
let tab_parents = trierParents(parents, tnoms, tnumeros);
afficher("Tri par parent croissant :", tab_parents);
tab_parents = trierParents(parents, tnoms, tnumeros, false);
afficher("Tri par parent décroissant :", tab_parents);
// trier par resp croissant
let tab_resp = trierResp(tresp, tnoms, tnumeros);
afficher("Tri par resp croissant :", tab_resp);
tab_resp = trierResp(tresp, tnoms, tnumeros, false);
afficher("Tri par resp décroissant :", tab_resp);