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 et obtenir uniquement les valeurs non identiques


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 253
    Points : 56
    Points
    56
    Par défaut Comparer deux tableaux et obtenir uniquement les valeurs non identiques
    Bonjour.
    titre precedent : "Comment obtenir le TimeStamp qui ne correspond pas aux jours identiques en comparant deux tableaux".

    J'ai édité le titre de ma question, car je viens de remarquer que pour une simple comparaison de chiffres la condition "false" pour non égal ne fonction pas non plus .
    avec cet exemple :
    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
    let Arr1 = [12, 5, 8, 130, 44], Arr2 =
    [12, 54, 18, 130, 44];
     
    let s = [];
    for (var i = 0; i < Arr1.length; i++) {
        for (var j = 0; j < Arr2.length; j++) {
          if(Arr1[i] === Arr2[j]){
     
          }else{
            s.push(Arr1[i]);
          }
     
          console.log(s);
        }
     
    }
    //resultat : [12,12,12,12,5,5,5,5,5,8,8,8,8,8,130,130,130,130,44,44,44,44]
    Quelqu'un peut-il m'expliquer .Je ne trouve aucune explication


    Je cherche à faire une comparaison de deux tableaux contenant des valeurs Timestamp (dates Unix) en vérifiant que les dates converties* respectives ne sont pas les mêmes dans chaque tableau et si c'est le cas d'afficher la ou les Timestamp qui correspondent .
    * dates converties = je vérifie: l'année, le mois et le jour.

    Actuellement mon code qui respecte toutes les conditions désirées m'affiche un résultat qui ne correspond pas à ce que j'attends.
    Codepen de mon code

    La valeur retournée est [1670331420], alors qu'elle devrait être [1670417820]
    Si vous pouvez m'aider à comprendre mon erreur , je vous remercie.

    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
    //TimeStamp from period choose by user
    let Array1 = [1670245020, 1670331420, 1670417820];
    let Array2 = [1670251033, 1670335700];
    //Dans l'ordre des timestamp : 5, 6 et 7 dec .
     
    const TimeStampAreOnSameDay = (Time1, Time2) =>
      Time1.getFullYear() === Time2.getFullYear() &&
      Time1.getMonth() === Time2.getMonth() &&
      Time1.getDate() === Time2.getDate();
     
    //console.log(TimeStampAreOnSameDay(new Date(1670417820*1000),new Date(1670335700*1000)));
     
    function SamedayCompare(Array1, Array2) {
     let DSelected = [];
      for (var i = 0; i < Array2.length; i++) {
     
        for (var j = 0; j < Array1.length; j++) {
          let nbchoose = Array1.length,
            nbexisting = Array2.length;
          let result = TimeStampAreOnSameDay(
            new Date(Array2[i] * 1000),
            new Date(Array1[j] * 1000)
          );
          if (result !== true) {
            DSelected.push(Array1[j]); //Add these values
          }
        }
     
      }
    return DSelected;
    }
    console.log(SamedayCompare(Array1, Array2));

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 351
    Points : 15 697
    Points
    15 697
    Par défaut
    vous avez mis le "return" dans une des boucles au lieu de le mettre à la fin de la fonction. donc la boucle n'est pas parcourue complètement.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 253
    Points : 56
    Points
    56
    Par défaut
    Merci c'est vrai, mais c'est parce que justement en fin de fonction ça ne fonctionnait pas , même problème.
    Je corrige. Le problème a changé : mais déjà expérimenté:
    le résultat : [1670331420,1670417820,1670245020,1670417820]
    Voir le codepen pour voir le résultat en direct.

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

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

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

    Vous pouvez utiliser new Set :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let filter=[...new Set(Array1),...new Set(Array2)]
    //.map(d=>Date.parse(d)) //si vous voulez convertir les valeurs en timeSTamp...
    console.log("sans double :",filter); 
    //résultat => ['2022-12-06T12:57:00.000Z', '2022-12-07T12:57:00.000Z', '2022-12-05T14:37:13.000Z', '2022-12-06T14:08:20.000Z']
    Est-ce le résultat attendu ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 253
    Points : 56
    Points
    56
    Par défaut
    Merci.
    Malheureusement pour moi je n'ai jamais vu cette expression [...Array1, ...Array2] et donc je ne la comprend pas. Et même en la voyant je ne sais pas quoi chercher sur le web pour apprendre cette syntaxe. Si vous pouvez m'expliquer merci par avance , ou lors un lien vers une documentation.
    Par contre en testant le code, le résultat n'est pas celui souhaité.

    Mon objectif est de récupérer uniquement les dates(timestamp) qui n'ont pas le même jour (année, mois et jour uniquement !!!! sans l'horaire)
    Dans l'exemple fourni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let Array1 = [1670245020, 1670331420, 1670417820];
    let Array2 = [1670251033, 1670335700];
    //Dans l'ordre des timestamp : 5, 6 et 7 dec .
    Je cherche a obtenir la troisième date du premier tableau que ce soit en comparant le timestamp soit sa date (new Date(Timestamp *1000).
    le premier et deuxième timestamp ont le même jour mais pas la même heure !

    Pour visualiser mon objectif :
    - je créé un événement
    - je definis une date de début et de fin
    - par défaut le jour actuel est affiché dans la section Période (avec des input Time pour définir des horaires de début et de fin)
    - si l'event dure plus d'un jour en changeant la date de fin ou de debut la section Période se met à jour et affiche les jours par substitution ou par ajout selon le nouveau nombre de jours inclu entre les dates de début et de fin.
    - Ainsi je dois comparer les dates (timestamp) afin d'afficher les dates des jours incluant la période de l'événement.

    La version PHP fonctionne parfaitement, à présent je dois permettre de cette mise à jour en instantanée .

    En attendant qu'un nerd m'aide à comprendre j'essaie une autre solution pour simplement comparé la date (année-mois-jour) de (new Date()) en utilisant une regex mais là aussi j'apprends et je suis coincé par une chose qui semble extrêmement simple :
    L'intérêt ici serait de revenir à une comparaison de nombre simple et de l'associer à l'index das le tableau. (j'espère)

    la valeur : 2022-12-06T12:57:00.000Z
    le résultat souhaité : 20221206
    la méthode : obtenir tout les chiffres avant la lettre "T" en ignorer les tiret.
    la syntaxe qui permet de le faire séparément mais que je n'arrive pas à associé en une fois :
    ^.+?(?=T) = contenu avant la lettre T en partant du début
    \d = que les chiffres.

    il ya aussi : sélectionné tout les chiffres dont au moins 2 sont situés avant ou après un tiret

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 351
    Points : 15 697
    Points
    15 697
    Par défaut
    les "..." correspondent à ça :
    https://developer.mozilla.org/fr/doc.../Spread_syntax

    Citation Envoyé par artenis Voir le message
    - si l'event dure plus d'un jour en changeant la date de fin ou de debut la section Période se met à jour et affiche les jours par substitution ou par ajout selon le nouveau nombre de jours inclu entre les dates de début et de fin.
    je n'ai pas compris à quoi correspond cette zone "période" pour votre évènement.

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

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

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

    mathieu vous a répondu sur la question de "..." qui s'appelle l'opérateur de décomposition.

    Si on prend cet exemple comme départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let Arr1=["2022-05-08T14:20:12.000Z","2022-05-08T20:14:00.000Z","2022-06-01T20:14:00.000Z"],
    Arr2=["2022-07-08T20:14:00.000Z","2022-05-09T20:14:00.000Z"],
    all=[...Arr1,...Arr2]
    .map(d=>Date.parse(d.split('T')[0])),
    filtred=all.filter(d=>all.lastIndexOf(d)===all.indexOf(d))
    .sort((a,b)=>a<b?-1:1);
    console.log(filtred);
    //Résultat =>["2022-05-09","2022-06-01","2022-07-08"]
    • d.split('T')[0] permet de récupérer tout ce qui vient AVANT le "T"
    • Date.parse() permet de convertir la chaine de caractère (date valide) en timesTamp
    • Si indexOf() et lastIndexOf() sont différents ceci dit que la valeur de la date est en double, donc ne pas la récupérer, n'est ce pas ?
    • sort() permet de trier les valeurs du tableau.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 253
    Points : 56
    Points
    56
    Par défaut
    Merci infiniment Toufik83 et Mathieu.

    L'explication est très claire et le code fonctionne exactement comme souhaité, par contre le code minifié m'est encore difficile à comprendre .

    Une dernière question : ou puis-je apprendre le code minifié ?
    Car les explications données en fin de réponse je connais leur fonctions, mais les => et (a,b)=>a<b?-1:1 sont pour moi impossible à reproduire sur un autre code actuellement. je vois bien qu'il s'agit d'une condition et que -1 (= ne correspond pas)

    J'arrive bien à comprendre la globalité mais pas la signification exacte et surtout je ne savais pas à ce jour qu'on pouvait utilisé des variables (all, a et b)sans les instancier au préalable.

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

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

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

    La condition de la fonction sort() permet de vérifier si la valeur de a est inférieur de b, si oui, on passe "a" au début puis "b" le suit et ainsi de suite...

    Les variables a et b sont des paramètres de la fonction sort, elles représentent les valeurs courantes examinées à chaque tour de la boucle.

    Il y'a deux façon pour l'écrire, soit avec les fonctions fléchées et pas d'accolades "{}" après le "=>" ((a,b)=>) et dans ce cas, on ne met pas les mots clés return ni function, ou bien avec la syntaxe normale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sort(function(a,b){
      return a<b ?-1:1;
    });
    Ou bien encore plus claire pour un débutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sort(function(a,b){
      if(a<b) return -1;
      else return 1;
    });
    Une condition ternaire est la même chose qu'une condition normale, seulement la syntaxe change .
    return a<b?-1:1; est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(a<b) return -1
    else return 1;
    La documentation des fonctions fléchées

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

Discussions similaires

  1. Des textes qui ne correspondent pas aux photos dans ma page !
    Par dhillig dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 07/03/2016, 02h44
  2. Mise en place de div qui ne correspond pas aux pourcentages de width
    Par francky74 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 06/03/2015, 11h10
  3. timestamp qui ne change pas
    Par Mathieu72 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/08/2007, 13h38
  4. [phpMyAdmin] Un coller qui ne correspond pas au copier du copier/coller
    Par lodan dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 24/02/2007, 12h53
  5. Réponses: 3
    Dernier message: 21/11/2006, 18h26

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