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

  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

  8. #8
    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 vandeyy Voir le message
    Quelqu'un peut-il m'expliquer pourquoi les valeurs ne sont pas écrasées ?
    Parce qu'en JavaScript une assignation sur un type non-primitif est une copie par référence, pas par valeur. Tu obtiens donc une array d'objets Message contenant une référence row vers le litéral row de l'array rows.

    Il faudrait que le constructeur de Message effectue un clonage de row ou décompose propriété par propriété l'objet row passé en paramètre.

    Utiliser les classes en JavaScript je trouve perso que c'est une fausse bonne idée, on croit qu'on fait de l'orienté objet alors que JavaScript n'est pas du tout conçu pour. C'est un keyword qui a été ajouté au langage pour pas trop brusquer ces pauvres développeurs Java et .NET qui sont dégoutés de devoir utiliser un langage qu'ils détestent et n'ont jamais pris le temps d'apprendre mais il n'a rien à y faire.

    Un très bon article sur le sujet.

  9. #9
    Membre éclairé

    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2004
    Messages
    768
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2004
    Messages : 768
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Utiliser les classes en JavaScript je trouve perso que c'est une fausse bonne idée, on croit qu'on fait de l'orienté objet alors que JavaScript n'est pas du tout conçu pour. C'est un keyword qui a été ajouté au langage pour pas trop brusquer ces pauvres développeurs Java et .NET qui sont dégoutés de devoir utiliser un langage qu'ils détestent et n'ont jamais pris le temps d'apprendre mais il n'a rien à y faire.

    Un très bon article sur le sujet.
    /Agree 2000%. Que dire de plus!

+ 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