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 :

Un petit code avec reduce et map


Sujet :

JavaScript

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 165
    Points : 61
    Points
    61
    Par défaut Un petit code avec reduce et map
    Bonjour,
    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
    function whatIsInAName(collection, source) {
     
      var srcKeys = Object.keys(source);
    console.log(srcKeys)
      // filter the collection
      return collection.filter(function(obj) {
        let w = srcKeys
          .map(function(key) {
            return obj.hasOwnProperty(key) && obj[key] === source[key];
          });
    console.log(w)
          let x = w.reduce(function(a, b) {
            return a && b;
          });
          /*let x = w.toString();*/   
          console.log(x)
          return x
      });
    }
     
     
    let result = whatIsInAName(
      [
        { first: "Romeo", last: "Montague" },
        { first: "Mercutio", last: null },
        { first: "Tybalt", last: "Capulet" }
      ], 
        { last: "Capulet" }
      );
      console.log(result)
    Ci-dessus un petit code que je comprends pas.
    J'ai ajouté des variables pour voir ce que le code fait étape par étape.
    Apparemment, ce que la méthode reduce() voit en entrée est un tableau [true] ou [false] et sa sortie est "true" ou "false".
    Le code fonctionne avec les variables, donc ce n'est pas un problème.

    Je ne comprends pas l'utilisation de map() et reduce() ici.
    Pour moi, map() doit transformer un tableau, alors que là on lui passe une condition et reduce() devrait réduire un tableau à une valeur alors que là j'ai l'impression qu'elle ne fait que transformer, par exemple, [true] en 'true'...
    Je n'arrive pas à comprendre ce qu'il se passe exactement.
    J'ai essayé de remplacer reduce() par :
    Mais le code ne fonctionne plus, donc pour finir je pense que je ne comprends rien du tout.

    Quelqu'un pour m'aider ?

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 396
    Points : 4 825
    Points
    4 825
    Par défaut
    Bonjour,

    map permet seulement de vérifier chaque item s'il réussit la condition ou pas, donc comme tu disais soit true soit false, et l'utilité de reduce sera plus importante lorsque tu passes en paramètre un objet qui contient plusieurs clés.

    Pour mieux comprendre ce qu'il se passe, on va ajouter un objet avec des clés {last:"Capulet", first:"Test"} pour que map cherchera un objet ayant deux clés last et first et aussi que last=="Capulet" ET le first=="Test"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    let result = whatIsInAName(
      [
        { first: "Romeo", last: "Montague" },
        { first: "Test", last: "Capulet" },//on ajoute ceci
        { first: "Mercutio", last: null },
        { first: "Tybalt", last: "Capulet" }
      ], 
        { last: "Capulet" ,first:"Test"}
      );
    console.log(result);
    /*Résultat est :[{first: 'Test', last: 'Capulet'}]*/
    Il y'a deux objets ayant le last==Capulet dans la collection alors que seulement celui qu'on a ajouté qui est retourné, pourquoi ? parce que map a retourné [true,true] pour { first: "Test", last: "Capulet" } et [false,true] pour { first: "Tybalt", last: "Capulet" } vu que le 2éme n'a pas le même first recherché et donc le reduce() de celui-ci a réduit le résultat de [true,false] a false.

    La fonction peut être résumée à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function whatIsInAName(collection, source){
      return collection.filter(function(obj){
        return  Object.keys(source)
          .map(function(key) {
            return obj.hasOwnProperty(key) && obj[key] === source[key];
          })
          .reduce(function(a, b){
            return a && b;
          });
      });
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 165
    Points : 61
    Points
    61
    Par défaut
    C'est très claire, merci beaucoup.

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

Discussions similaires

  1. Explication de code avec la fonction map
    Par mlny84 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/10/2007, 14h59
  2. Petit problème avec un code : besoin de votre aide :)
    Par loicdu4000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/09/2006, 19h02
  3. un petit code tout simple o_O avec des $POST variable :)
    Par dark_vidor dans le forum Langage
    Réponses: 5
    Dernier message: 08/04/2006, 02h08
  4. Probleme avec un petit code (je debute)
    Par cladou dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 10/01/2006, 19h56
  5. help sur un petit code avec XMLHttpRequest et setTimeout
    Par grinder59 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/10/2005, 11h22

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