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 :

Map explications sur une ligne de code


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 303
    Par défaut Map explications sur une ligne de code
    Bonjour,

    Je n'arrive pas à comprendre complètement l'instruction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cb(rows.map((row) => new Message(row)))
    Je sais qu'il va créer un tableau de clé et de valeur.
    mais, j'ai beaucoup de mal à intégrer/digérer cette simple ligne de codage !


    voici le code complet !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    let connection = require('../config/db')
    let moment = require('moment')
     
    class Message
    {
     
        constructor(row)
        {
            this.row = row
        }
     
        get content()   {  return this.row.content }
        get created_at() { return moment(this.row.created_at).startOf('hour').fromNow();  }
     
        static create (content, cb)
        {
            connection.query('INSERT INTO messages SET content = ?, created_at = ?',
                        [content, new Date()],
                        (err, result) => {
                                            if (err) throw err
                                            cb(result)
                                        } 
                        )
        }
        static all (cb) 
        {
            connection.query('SELECT * FROM messages', 
                        (err, rows) => {
                                            if (err) throw err
                                            cb(rows.map((row) => new Message(row)))
                                        }
                            )
        }
     
    }
     
    module.exports = Message
    Pouvez-vous m'aider ?

    Merci

    Yves

  2. #2
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Je ne sais pas ce que fait ta fonction cb, elle est injectée dans create et all (par ?).

    En revanche pour ce morceau si c'est ça qui pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rows.map((row) => new Message(row))
    Ça va te transformer retourner une nouvelle nommée rows retournée par ta db en une array d'objets de classe Message.

  3. #3
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 303
    Par défaut
    Bonjour,

    Merci pour la réponse.

    Voici le code pour le "cb"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    app.get('/', (request, response) => {
        let Message = require('./models/message')
        Message.all(
                    function (messages) {
                        response.render('pages/index', {messages: messages})   
                        }
                    )
     })
    En fait, c'est la construction (la syntaxe) de la ligne qui est difficile à digérer !
    comme je peux comprendre on instancie la classe dans la classe !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rows.map((row) => new Message(row))
    Merci,

    Yves

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    J’ajoute quelques précisions : la méthode map retourne un nouveau tableau, elle ne modifie pas le tableau original.
    Sa syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unTableau.map(uneFonction)
    uneFonction est appelée autant de fois qu’il y a d’items dans le tableau ; elle reçoit à chaque fois l’item en paramètre, et doit retourner (avec return) ce qui sera l’item correspondant dans le nouveau tableau.

    L’article MDN de map montre différents exemples.

    Dans le cas présent, la fonction passée a la forme d’une arrow function dont le corps est une expression (pas un bloc encadré par des accolades). Dans ce cas le return est implicite, c’est le résultat de l’expression qui est retournée par la fonction.

    Pour parler en code, cette forme :
    est équivalente à celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (param) => { return expression; }
    Ainsi,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cb(rows.map((row) => new Message(row)))
    est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cb(rows.map((row) => { return new Message(row); }))
    Pour rendre le code plus lisible, on peut le réécrire avec une variable intermédiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var messages = rows.map((row) => { return new Message(row); });
    cb(messages)
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Citation Envoyé par Watilin Voir le message
    J’ajoute quelques précisions : la méthode map retourne un nouveau tableau, elle ne modifie pas le tableau original.
    Watilin a raison, la précision est très importante j'ai très mal formulé ma réponse que j'ai modifié !

  6. #6
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 303
    Par défaut
    Merci à vous pour vos réponses.

    Yves

  7. #7
    Membre éclairé
    Inscrit en
    Février 2004
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 303
    Par défaut
    Bonjour,

    Juste un petit point qui me parrait étrange !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cb(rows.map(  (row) => new Message(row)  )  )
    le "new Message(row)" fait appel au constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    constructor(row)
        {
            this.row = row
        }
    J'ai l'impression que celui-ci écrase la valeur du row précédent et pourtant ce n'est pas le cas, il ajoute chaque row de l'objet rows.
    Donc, dans mon raisonnement row devrait contenir le dernier row de l'objet rows (car c'est juste une assignation) !

    Là, je suis perdu !!!

    Quelqu'un peut-il m'expliquer pourquoi les valeurs ne sont pas écrasées ?

    Merci d'avance,

    Yves

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

Discussions similaires

  1. [TAPI]Explication d'une ligne de code
    Par Pmatt dans le forum C
    Réponses: 7
    Dernier message: 15/01/2007, 19h57
  2. besoin d'aide sur une ligne de code
    Par deubelte dans le forum C++
    Réponses: 5
    Dernier message: 26/11/2006, 21h55
  3. explication sur une ligne
    Par Pitou5464 dans le forum C
    Réponses: 12
    Dernier message: 31/10/2006, 17h12
  4. [Tableaux] Explication d'une ligne de code
    Par eXiaNazaire dans le forum Langage
    Réponses: 3
    Dernier message: 30/03/2006, 13h09
  5. PB sur une ligne de code
    Par romrai dans le forum Access
    Réponses: 2
    Dernier message: 22/02/2006, 11h27

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