Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/09/2016, à 05:13

temps

JS comment sortir une valeur numéique d'une boucle

Bonjour,
Je dois écrire 70 fois

var input1 = document.getElementById("Nb1");
localStorage.removeItem("nb1", input1.value);
localStorage.setItem("nb1", input1.value);
donne1 = localStorage.getItem("nb1");

en incrémentant le chiffre 1, pour récupérer les données d'une page HTML.
Plutot qu'écrire 70 fois le code, j'ai créé une boucle :

var anommeur1= "Nb";
var bnommeur1= "nb";
var cnommeur1= "input";
var dnommeur1= "donne";

function antinotdefini(anommeur,bnommeur,cnommeur,dnommeur)
{
cnommeur = document.getElementById(anommeur);
localStorage.removeItem(bnommeur, cnommeur.value);
localStorage.setItem(bnommeur, cnommeur.value);
dnommeur = localStorage.getItem(bnommeur);
return dnommeur;
}
function regarde() {
for (varie = 1; varie < 71; varie++) {
var anommeur = anommeur1.concat(varie); 
var bnommeur = bnommeur1.concat(varie);
var cnommeur = cnommeur1.concat(varie);
var dnommeur = dnommeur1.concat(varie);
antinotdefini(anommeur,bnommeur,cnommeur,dnommeur);
					}
		}

En plaçant la sortie dans une fonction (seul les fonctions ont accès aux variables ), malgré cela j’obtiens

not defined

Est-ce que quelqu'un sait comment faire pour récupérer une valeur dans une boucle?
cordialement


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#2 Le 28/09/2016, à 20:23

soshy

Re : JS comment sortir une valeur numéique d'une boucle

Salut,
Etant donné que ta fonction principale "regarde" n'a pas de return ce n'est guère étonnant.

Plusieurs choses:
1- le nom des variables n'aide pas a la compréhension, le formatage anarchique non plus. (j'ai beau répondre, je ne suis pas certain d'où tu veux en venir)
2- Pourquoi donner une valeur "input" de type String à la variable cnommeur alors qu'elle ne servira à rien ? Immédiatement remplacée par un Objet (confusion de types) ce qui rend les choses encore plus compliquées à comprendre.
3- J'espère que tu te rends compte du dilemme intellectuel de la question "récupérer une valeur dans une boucle?"... Soit tu boucles sur une liste d'éléments pour chercher une valeur précise et tu t'arretes (ou pas) dès que tu as trouvé, soit tu boucles pour récupérer un ensemble de valeurs (et donc pas "une"). Voir les exemples plus bas.
4- localStorage.removeItem(bnommeur, cnommeur.value); c'est pas bon, localStorage.removeItem() ne prend qu'un paramètre en entrée : la clé.

// 1er cas, retourne le 50ème en ayant parcouru la boucle 70 fois
function regarde1() {
    var resultat; // les 70 "dnommeur"
    var key = "nb";
    var inputElement;
    for (var i = 1; i < 71; i++) {
        inputElement = document.getElementById("Nb" + i);
        localStorage.removeItem(key + i);
        localStorage.setItem(key + i, inputElement.value);
        if (i === 50) {
            resultat = localStorage.getItem(key + i);
        }
    }
    return resultat;
}
console.log(regarde1());
// 2ème cas, retourne un tableau d'éléments. A chaque itération on a ajouté un élément au tableau (donc 70 éléments)
function regarde2() {
    var resultat = []; // les 70 "dnommeur"
    var key = "nb";
    var inputElement;
    for (var i = 1; i < 71; i++) {
        inputElement = document.getElementById("Nb" + i);
        localStorage.removeItem(key + i);
        localStorage.setItem(key + i, inputElement.value);
        resultat.push(localStorage.getItem(key + i));
    }
    return resultat;
}
var tableau = regarde2();
console.log(tableau); // affiche le tableau de résultat
console.log(tableau[4]); // affiche le 5ème élément du tableau de résultat

Dernière modification par soshy (Le 28/09/2016, à 20:32)

Hors ligne

#3 Le 29/09/2016, à 03:15

temps

Re : JS comment sortir une valeur numéique d'une boucle

Bonjour,
Merci pour la réponse.
En regardant le code dans adn.js, https://addons.mozilla.org/fr/firefox/a … ions/2.3.6 nous pouvons nous apercevoir que la fonction regarde, n'a pas besoin de return, celle-ci est appelée pour prendre en compte les valeurs entrées dans la page HTML
Explications : Le code est conçu pour un addon qui va permettre d'utiliser un format audio ultra léger que j'ai créé en 2010, il se nomme abadie.adn, une variante de abadie.jo, pour se faire nous utilisons "localStorage" et donc la fonction n'a pas besoin de return

Concernant le nom des variables : S'il est coutume aux gourous informatiques d'accorder une fonction précise à certains termes "en exemple input", il ne faut pas oublier que ma démarche est de créer un truc modifiable grand publique, pour que chacun puisse utiliser et modifier l'addon, ainsi l'entendement du terme est différent.

...

Concernant localStorage, nous pouvons l'utiliser de multiple manières, j'ai expliqué comment et pourquoi je l'utilise juste au dessus, il n'y a pas de "dilemme intellectuel ", il y a juste plusieurs techniques possibles d'utiliser les éléments et d'expressions selon le publique visé.

Merci pour les codes, je vais regardé si je trouve à l'intérieur un indice qui me permettra de remplacer par une boucle ce bout de code assez long (71 répétitions maintenant)

cordialement

P.S. Je vais mettre à jour le code aussi dans github c'est ici :
https://github.com/search?utf8=%E2%9C%93&q=lecjoa

J'ai testé le deuxième code proposé et j'obtiens au log:

Array [ "226", "246", "1", "", "", "", "", "", "31", "247", 60 more… ]

c'est exactement le même problème qu'avec mon écriture, ce sont des alphanumériques non pas des valeurs numériques, mais du fait que ce soit un array je vois peut-être un map(number) en solution
Je testerai le premier code proposé un peu plus tard

Dernière modification par temps (Le 29/09/2016, à 04:21)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#4 Le 29/09/2016, à 14:34

soshy

Re : JS comment sortir une valeur numéique d'une boucle

Ta fonction en l'etat actuel n'a pas besoin de return car elle est ecrite en suivant de mauvaises regles de programmation.

Si on reprend ce que tu as ecrit (en simplifiant), et qui est mauvais en terme de programmation, on a:

var x = "une valeur";
fonction maFonction() {
  x = "une autre valeur";
}

Modifier dans une fonction la valeur d'une variable declaree en dehors de ladite fonction est une mauvaise pratique. Utiliser des variables globales, meme si c'est pratique et que ca fonctionne (je faisais ca aussi fut un temps), ca n'en reste pas moins une mauvaise pratique a eviter. Certains conciderent ca tellement mal qu'ils ont inventes des langages (les langages fonctionnels pour ne pas les citer) ou ce genre de chose est interdit/impossible a realiser.

La vraie bonne facon de proceder c'est :

fonction maFonction() {
  return "une autre valeur";
}
var x = "une valeur";
x = maFonction();

Et du coup la tu as des return.

Gourou de l'informatique ou pas, un code qui suit les bonnes pratiques en terme aussi bien de programmation / redaction / formatage, est plus simple a comprendre. Et il existe aussi les commentaires pour detailler les bouts de code qui seraient plus obscures et eclairer sur le raisonnement/l'intention qui se cache derriere.

Ton probleme n'est pas la boucle, c'est le code apres. A la limite tu n'as pas a faire de return puisque la valeur qui t'interesses tu la ranges dans localStorage, et que donc tu peux y acceder n'importe quand.
Du coup, au lieu d'avoir un truc pareil par la suite:

for (nombi = 0; nombi < donne71; nombi++) {

tu aurais

for (nombi = 0; nombi < localStorage.get("nb71"); nombi++) {

Ou alors en gardant le return, il faudrait remplacer avec un truc du genre:

var tableauDeResultat = regarde2();
// ...
for (nombi = 0; nombi < tableauDeResultat[69] ; nombi++) { // valeur de la 70eme case du tableau renvoye par regarde2

pareil avec tous les autres "donneXX".

Dernière modification par soshy (Le 29/09/2016, à 14:50)

Hors ligne

#5 Le 30/09/2016, à 04:37

temps

Re : JS comment sortir une valeur numéique d'une boucle

Bonjour,

Merci pour la réponse et les explications.
Concernant les variables, le code est une adaptation d'une version en c, d’où l'habitude de déclarer les variables en début et puis de les manipuler à travers différentes actions.

Je vais regarder ça de plus près. En fait j'ai déjà plusieurs manières d'écrire le code, mais aux tests d'utilisation c'est la répétition qui est la moins gourmande en ressources.
Je vais tester encore afin de déterminer les limites et avoir un code qui soit le moins gourmand possible en mémoire, actuellement les boucles que j'ai testées m'ont fait apparaître des défauts que je n'avais pas rencontré jusqu'ici.

Cordialement


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#6 Le 04/10/2016, à 18:41

tutosfaciles48

Re : JS comment sortir une valeur numéique d'une boucle

Bonjour, au niveau du push:

variable.push(parseFloat(localStorage.getItem(key + i)))

Hors ligne

#7 Le 04/10/2016, à 23:03

temps

Re : JS comment sortir une valeur numéique d'une boucle

Bonjour,
Merci pour la solution.
Je vais la tester. Bien que je pense que la boucle est une meilleure solution.
Quand nous utilisons la boucle, nous ne faisons qu'une seule lecture des données se trouvant dans la page HTML, des données que nous plaçons en mémoire.
Si nous associons la lecture au push, il est vrai que nous ne lisons que ce qui est nécessaire (contrairement à la boucle qui fait une lecture complète), mais comme dans la structure nous avons des boucles de boucles, cela veut dire que nous allons relire selon, des centaines de fois la même donnée dans la page html

Cordialement


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#8 Le 15/10/2016, à 07:22

temps

Re : JS comment sortir une valeur numéique d'une boucle

Bonjour,
Merci beaucoup pour :

fonction maFonction() {
  return "une autre valeur";
}
var x = "une valeur";
x = maFonction();

Effectivement en utilisant cette technique, je n'ai plus les effets étranges quand je génère les fichiers audio en format texte dans adn.js  Dommage, je n'arrive toujours pas à construire une boucle apportant un plus en utilisant localstorage (qui est une contrainte conceptuelle).
J'ai décidé de passer par la communauté d'une asso de tux pour affiner l'écriture des codes, ce qui me permet de me concentrer sur le module final de l'addon lecjoa, un plugin audio qui génère les sons à partir de seulement 6 octets

La question devient quelle est la meilleure pratique :
L'addon piste toutes les pages web ouvertes pour contrôler si elles contiennent un localstorage nommé donne1
ou
C'est la page web qui doit appeler l'addon pour dire quelle contient des localstorage (domme1,  donne2, donne11) donne11 est le nombre de fronts manipulé donc il y sera toujours, si il y a de l'audio au format adn dans la page web

Le code est dans https://addons.mozilla.org/en-US/firefox/addon/lecjoa/ mais aussi dans  github si quelqu'un veut faire un fork pour aider.https://github.com/temps9/lecjoa

Cet outil finalisé va servir à au moins une association du libre alentour Région de Montpellier  pour vulgariser l'informatique en passant par des exercices et tutoriels multidirectionnels généré par lecjoa

Cordialement

Dernière modification par temps (Le 15/10/2016, à 07:25)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne