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 :

Comparer deux tableaux pour en créer un troisième


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2019
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Comparer deux tableaux pour en créer un troisième
    Bonjour,

    après plusieurs dizaines d'heures de recherche infructueuses je n'arrive toujours pas à effectuer cette conversion qui m'empeche de terminer mon site web .
    Je pense avoir tout essayé et je n'arrive vraiment pas à trouver de solution.

    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
    array1 = {
        nom: 'bernard',
        user_img: 'http://'
    }, {
        nom: 'matthieu',
        user_img: 'http://'
    }, {
        nom: 'sophie',
        user_img: 'http://'
    }
     
    array2 = {
        nom: 'matthieu',
        note: 17
    }, {
        nom: 'sophie',
        note: '14'
    }, {
        nom: 'bernard',
        note: 10
    }, {
        nom: 'matthieu',
        note: 12
    }, {
        nom: 'sophie',
        note: 17
    }, {
        nom: 'bernard',
        note: 20
    }
    Voila je souhaiterais que ces deux tableaux soit combiner en un seul comme celui ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    array3 = {
        nom: 'bernard',
        user_img: 'http://',
        moyenne: 15
    }, {
        nom: 'matthieu',
        user_img: 'http://',
        moyenne: 14.5
    }, {
        nom: 'sophie',
        user_img: 'http://',
        moyenne: 17
    }
    Merci beaucoup

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Ben comment tu obtiens cela ? Il faudrait peut-être changer la manière dont tu obtiens et stocke ces informations...

    Ce ne sont pas des tableaux, array1, array2 et array3 sont des objets, seules les premières accolades sont prises en compte, les autres séparés par des virgules c'est une erreur de syntaxe...

    En fait il manque les crochets []...

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    À ta place, je passerai par une étape intermédiaire qui consiste à créer un objet dont les "clefs" sont les noms et les valeurs celles de arr1 avec en plus une propriété notes.

    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
    let arr1 = [ { nom: 'bernard', user_img: 'http://' },
                 { nom: 'matthieu', user_img: 'http://' },
                 { nom: 'sophie', user_img: 'http://' } ];
     
    let arr2 = [ { nom: 'matthieu', note: 17 },
                 { nom: 'sophie', note: 14 },
                 { nom: 'bernard', note: 10 },
                 { nom: 'matthieu', note: 12 },
                 { nom: 'sophie', note: 17 },
                 { nom: 'bernard', note: 20 } ];
     
    let obj = {}, result = [];
     
    for (const o of arr1) {
        o.notes = [];
        obj[o.nom] = o;
    }
     
    for (const o of arr2) {
        obj[o.nom].notes.push(o.note);
    }




    Citation Envoyé par Beginner
    ... les autres séparés par des virgules c'est une erreur de syntaxe...
    Même si ce n'est pas le but recherché ici, ce n'est pas une erreur de syntaxe, rien n'empêche de séparer des instructions par des virgules:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    toto = [1,2], toto.push(3);
    function tata() {
        return toto.push(4), true;
    }
     
    console.log(tata()); // true
    console.log(toto); // [1,2,3,4];
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Même si ce n'est pas le but recherché ici, ce n'est pas une erreur de syntaxe, rien n'empêche de séparer des instructions par des virgules: [code]toto = [1,2], toto.push(3);
    Merci et +1 ! Je ne savais pas ça...

    Pour return toto.push(4), true; c'est toujours ce qui est renvoyé par la dernière "instruction" qui est retournée (return) et les instruction d'avant sont juste exécutées, c'est ça ?



    EDIT : Du coup c'est quoi la différence exactement avec la le point virgule ? Même si j'ai une idée je pose la question quand même...

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par Beginner
    c'est toujours ce qui est renvoyé par la dernière "instruction" qui est retournée (return) et les instruction d'avant sont juste exécutées, c'est ça ?
    Oui, c'est ça.

    Maintenant tu ne peux pas séparer tout et n'importe quoi avec une virgule, par exemple quand la situation est ambiguë: let arr=[], arr.push(1); ne marchera pas. (C'est vu comme une tentative de redéclaration de la variable, étant donné que la syntaxe de let/var/const utilise déjà les virgules pour déclarer plusieurs variables d'un coup.)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Pour obtenir un tableau d'objets, avec pour chaque objet la moyenne des notes obtenues dans arr2, je propose la solution suivante :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    const
        arr1 = [{
                nom: 'bernard',
                user_img: 'http://'
            },
            {
                nom: 'matthieu',
                user_img: 'http://'
            },
            {
                nom: 'sophie',
                user_img: 'http://'
            }
        ],
        arr2 = [{
                nom: 'matthieu',
                note: 17
            },
            {
                nom: 'sophie',
                note: 14
            },
            {
                nom: 'bernard',
                note: 10
            },
            {
                nom: 'matthieu',
                note: 12
            },
            {
                nom: 'sophie',
                note: 17
            },
            {
                nom: 'bernard',
                note: 20
            }
        ];
     
    let
        arrMoyen = [],
        nb = 0;
     
    arrMoyen = arrMoyen.concat(arr1);
     
    for (const obj of arrMoyen) {
        obj['moyenne'] = 0;
        obj['nbNotes'] = 0;
    }
     
    // debug
    console.table(arrMoyen);
     
    for (const obj of arrMoyen) {
        nb = 0;
     
        for (const objInArr2 of arr2) {
            if ( obj['nom'] === objInArr2['nom'] ){
                obj['moyenne'] += objInArr2['note'];
                obj['nbNotes'] = ++nb;
            }
        }
    }
     
    // debug
    console.table(arrMoyen);
     
    for (const obj of arrMoyen) {
        obj['moyenne'] = Number(obj['moyenne'] / obj['nbNotes']).toFixed(2);
    }
     
    // debug
    console.table(arrMoyen);

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ok, puisque c'est ça, voici la fin de mon script précédent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (const name of Object.keys(obj)) {
        result.push({ nom: name,
                      user_img: obj[name].user_img,
                      moyenne: obj[name].notes.reduce((a,b) => a+b)/obj[name].notes.length
        });
    }



    Autre méthode utilisant un objet Map:
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const mUser = new Map(arr1.map(o => { return o.moyenne = [], [o.nom, o] }));
     
    for (const o of arr2) {
        mUser.get(o.nom).moyenne.push(o.note);
    }
     
    mUser.forEach(o => {
        o.moyenne = o.moyenne.reduce((a,b) => a+b)/o.moyenne.length
    });
     
    let result = Array.from(mUser.values());
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2019
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Je voulais vraiment vous remercier de m'avoir aidé c'est super sympas.

    Du coup j'ai utilisé la méthode de danielhagnoul qui paraissait plus simple à mes yeux et tout fonctionne c'est génial !

    Je ne connaissais pas également le console.table() qui je pense à l'avenir me sera indispensable.

    Bref merci encore !

  9. #9
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Les deux codes proposés par CosmoKnacki et danielhagnoul sont instructifs, c'est intéressant de voir différentes solutions...

    PS : @CosmoKnacki ok merci pour la réponse à ma question.

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

Discussions similaires

  1. [XL-2010] Comparer deux bases de données pour en créer une troisième
    Par Xaphalys dans le forum Excel
    Réponses: 5
    Dernier message: 24/07/2014, 13h24
  2. [Tableaux] Une fonction pour comparer deux tableaux ?
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 20/06/2009, 11h11
  3. Comparer deux tableaux
    Par gefrey54 dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 12/09/2007, 10h58
  4. comparer deux tableaux
    Par djibril dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 15h26

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