IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Additionner les valeurs de tableau


Sujet :

JavaScript

  1. #1
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut Additionner les valeurs de tableau
    Bonjour,
    Je me fais la main sur JS ne connaissant pas ce langage. Du coup j'ai fait un exo dont je ne comprends pas la solution et j'aurais besoin d'explications (j'ai qd même trouvé une réponse, mais c'était une usine à gaz)

    Le but est d'additionner ts les chiffres es nombres d'une date de naissance jusqu'à n'obtenir qu'un chiffre ultime : ex "1995-12-31" => 1+9+9+5+1+2+3+1 => 31 => 3+1 = 4

    La solution proposée est celle-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function lifePathNumber(dateOfBirth) {
     let num = dateOfBirth.split("-").join("");
      while(num > 9){
      num = ('' + num).split("").reduce((p,c) => +p+ +c);
      }
      return num;
    }
    Je ne comprends pas 2 choses :
    - let num qui est une string et qui est passée dans la condition du while ?
    - la syntaxe ('' + num) : que viennent faire les '' devant num ici, je remarque que enles enlevant ça lève une erreur de type "split is not a function"

    Merci à vous

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Bonjour,

    let num qui est une string et qui est passée dans la condition du while ?
    num est bien un nombre;

    la syntaxe ('' + num) : que viennent faire les '' devant num ici, je remarque que enles enlevant ça lève une erreur de type "split is not a function"
    Les guillemets transforment num en chaîne, indispensable pour la méthode split();

    on peut aussi faire une ptite récursion:

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const add=(n)=> String(n).length>1 ? 
    		add(String(n).replace(/\D/g,"").split("").reduce((a,b)=>a+Number(b),0)) :
    		n
     
    console.log(add("1995-12-31"))

  3. #3
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Désolé d'insister, justement je ne comprends pas pourquoi num est un nombre alors que ligne 2 au dessus il contient une chaine de caractère.
    Je devrais plutôt dire que je ne comrends pas pourquoi num n'est pas une chaine de caractère ds le while et idem en dessous où les quotes sont ajoutées

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Alors on va dire que num est interprétée comme number parce qu'on la compare à un nombre...

  5. #5
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Ok, c'est précisement le côté (et la puissance) de js que je pige pas pour l'instant, merci à toi d'avoir pris le temps

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    A la ligne 4, c'est un peu différent: reduce renvoie un nombre et split() ne convertit pas l'objet en chaine automatiquement;

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    À noter que dans la série des conversions implicites, on peut ici exploiter le OU binaire avec 0 (i | 0 dans le code) qui renvoie 0 lorsque le caractère n'est pas un chiffre et la valeur du chiffre dans le cas contraire. Comme ça on fait d'une pierre deux coups, plus la peine de filtrer les caractères, et la conversion en Number est automatique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let dateOfBirth = '1995-12-31';
     
    function pathOfLife(n) {
        do {
            n = [...`${n}`].reduce((c, i) => c + (i | 0), 0);
        } while ( n > 9 );
     
        return n;
    }
     
    console.log(pathOfLife(dateOfBirth)); // 4
    Comme dans le code original, n est de type String au premier tour de la boucle, mais devient de type Number aux suivants, c'est pourquoi j'utilise un template literals `${n}` (littéraux de gabarits en québécois) pour obtenir une chaîne.

  8. #8
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Ah oui, très joli la conversion de number en string

    Et comme au bout du 2e passage, n est un nombre, on peut éviter le test "redite"
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const date="1995-12-31";
    const add= n => (""+n)[1] ? 
    		add([...`${n}`].reduce((a,b) => a+Number(b),0)) :
    		n
     
    console.log(add(date.replace(/\D/g,"")))

  9. #9
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Hello les pros du JS,

    Comme dans le code original, n est de type String au premier tour de la boucle, mais devient de type Number aux suivants, c'est pourquoi j'utilise un template literals `${n}`
    Du fait de la conversion de type, il faut utiliser obligatoirement les litteraux de gabarit dans ce cas ?

  10. #10
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Pas d'obligation: c'est juste que là, c'est bien pratique parce que

    Number est converti en String par les littéraux de gabarit;
    String est converti en Array par l'opérateur de décomposition;
    On peut donc rappeler reduce sans problème à chaque passage.

    Sinon, tu repasses n par la moulinette split("") pour en refaire un tableau ou tu écris [...(""+n )];

  11. #11
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    J'essaie de récupérer les chiffres qui composent un nombre.
    A mon niveau je n'ai que ça pr l'instant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    a=89;
     
    function covertInNumbers(a) {
    return (''+a).split('').map(nb => parseInt(nb, 10));
    }
    Ca me paraît lourd, du coup j'ai essayé de faire ça, mais cela ne fonctionne pas, est-ce que c'est réalisable de convertir un tableau de string directement dans le spread operator avec + ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    a=89;
     
    function covertInNumbers(a) {
    //ne fonctionne pas du tout et renvoie un array string
      return [...`${+a}`];
    }
    merci encore

  12. #12
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Tu n'as pas besoin du + dans [...`${+a}`];

  13. #13
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    `${a}` permet de transformer le Number en String (de même en PHP on pourrait écrire: $a = 18; puis l'intégrer dans une chaîne comme ceci "$a" pour le "caster" en string).

    La syntaxe spread ...truc va décomposer la chaîne truc en caractères. Le fait d'ajouter des crochets autour produira un tableau de ces caractères.

    Donc [...`${a}`] produit la même chose que (''+a).split('') mais pas plus.

    Pour que chaque caractère soit converti en Number, il faut boucler sur ce tableau (que ce soit de manière explicite avec for ou de manière implicite comme tu l'as fait avec la méthode Array.prototype.map()) pour appliquer la conversion à chaque item, et ce, quelque soit la manière utilisée.

  14. #14
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Ok, merci beaucoup, je pensais que tous les types de variable étaient interprétés avec les littéraux de gabarits (comme le number ici), visiblement ça n'est pas le cas, J'avais mal compris la doc.
    Je n'ai plus qu'à m'attaquer aux conversions implicites pour consolider tout ça sérieusement. J'avoue que le coup du OU m'a impressionné

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. additionner les valeurs d'un champs
    Par gussoner dans le forum VBA Access
    Réponses: 12
    Dernier message: 15/09/2007, 15h32
  2. Réponses: 12
    Dernier message: 13/03/2007, 23h21
  3. c++ valeur la plus grande parmis les valeurs dun tableau
    Par corseb-delete dans le forum C++
    Réponses: 19
    Dernier message: 14/12/2006, 22h14
  4. Comment additionner les valeurs de 3 labels
    Par morrison29 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 16/11/2006, 19h52
  5. [MySQL] Additionner les valeurs d'un tableau
    Par covin85 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/08/2006, 14h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo