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 ou trois array et avoir les memes valeurs dans toutes les array


Sujet :

JavaScript

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre exp�riment�
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 167
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par d�faut Comparer deux ou trois array et avoir les memes valeurs dans toutes les array
    Bonjour � tous,

    J'ai un exercice un peu p�rilleux car je dois comparer deux, trois ou quatre arrays et faire en sorte qu'elles soient identique. Mais surtout que les changements soient report�s dans une autre array, en respectant l'ordre.

    Je m'explique. Je prends des mesures toutes les heures sur un terrain qui sont affich�es sur un graphique � deux axe gr�ce � chartsjs. Mais des fois, un capteur peut �tre en panne, ou ne pas avoir le m�me nombre de valeurs dans un espace de temps.

    Par exemple, je prends la temp�rature du sol et de l'air. Mon barom�tre �tait aujourd'hui en panne et je l'ai remplac�. Donc dans la journ�e j'avais six mesures de l'air (dont 3 le matin et trois le soir, et 24 mesure du sol. Dans ce cas, chartjs, m'affiche un peu n'importe comment.

    Ceci parce que dans l'array de la temperature de l'air j'ai 6 index de 0 � 5.
    Et dans l'array de la temperature du sol, j'ai 24 index de 0 � 23.
    Donc si je parcours les deux arrays, depuis l'index 0 � 2, les heures vont correspondre, mais ensuite, il y a une incoh�rence dans l'affichage des valeurs en fonction du temps.

    L'id�e est de comparer les arrays et de fusionner les valeurs.
    Mais attention, c'est plus compliqu� que cela car il peut avoir 3 voir 4 array.
    Mais surtout, si des dates sont ajout�es dans l'array de gauche, il faut aussi que des valeurs de 0 soient ajout� dans une autres tables, au m�me index.

    Voici plus de pr�cisions
    Si je reprends mon exemple de la temp�rature du sol et de l'air, la temp�rature du sol est affich� dans mon axe Y de gauche, et la temperature de l'air sera affich� dans mon axe Y de droite.

    Pour bien suivre mon probl�me, rendez vous sur cette page
    http://www.smart-idea.io/perrieres/
    S�lectionner les dates de 03-09-201805-09-2018, et s�lectionner la station 2 et regarder le graph Temp�rature.
    (apr�s avoir s�lectionner les dates, faite peut-�tre un ctrl+r, pour avoir un console log un peu plus all�g� )
    J'ai fais un console.log
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    console.log("Temperature Success:",data);
    Je continue mon explication.

    Si vous d�veloppez "temp�rature success", il y a deux objets.
    Le premier objet correspond � la temp�rature de l'air dont les valeurs seront affich�es sur mon axe Y de gauche car 'y-axis-0'
    Le deuxi�me objets correspond � la temp�rature du sol dont les valeurs seront affich�s sur mon axe Y de droite car 'y-axis-1'

    Vous pouvez d�j� constater 'labels' o� sont les dates et heures.
    Dans le premier objet, il y a 5 index, dans le deuxi�me objet, il y a 36 index (donc pas 24, car j'ai red�marrer ma station 8 fois)

    Si vous observer l'index 1 de mon deuxi�me objet, la date est '2018-09-03 19:26:42' mais cette date ne figure pas dans mon premier objet.

    Il faudrait qu'elle figure aussi � l'index 1 et d�caler les autres valeurs. Donc index 1 devient index 2 pour donner la place de '2018-09-03 19:26:42' � l'index 1. Mais il faut surtout que dans le premier l'objet , sous datasets->data que l'index 1 devient aussi index 2 pour que l'index 1 prenne la valeur de 0. (0 car aucune valeur est mesur�e � ce moment l�)
    C'est tr�s important que la valeur correspondant � une date, ait le m�me index. Voyez-vous le probl�me?

    Mais ca se complique car si vous regarder le graphique "humidit� du sol", il y a 3 m�me capteurs d'humidit� du sol (plant�s � des profondeurs diff�rentes) dont les valeurs s'affichent dans l'axes Y de gauche, et dans l'axe Y de droite, il y a un compteur de goutte. Ce qui fait 4 objets dont trois avec 'y-axis-0' et un avec
    'y-axis-1'. Et plus tard, il y aura 5 objets car dans l'axes Y de droite, il y aura les valeurs d'un compteur de goutte et un pluviom�tres.


    J'esp�re que j'ai �t� bien explicite explicite?
    Vous avez compris qu'il aie deux ou 6 objets, il faut toujours que mes array 'labels' et 'data' ont les m�mes tailles.

    S'il manque une date � un array/objet , donc aussi une valeur dans 'datasets->data', il faudrait ajouter un index dans 'labels' avec la date correspondante aux autres et ajouter la valeur de 0 dans datasets->data et que l'index de cette valeur correspond � l'index de 'labels'.

    Ouha, voyez-vous? ai-je �t� claire? m'avez-vous compris? et derni�re question, comment je peux donc comparer, fusionner et injecter une valeur dans une autre array en gardant une correspondance au niveau des index?

    Milles mercis pour vos mumi�res
    P.

  2. #2
    Membre extr�mement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par d�faut
    J'ai pas tout lu, t'a lair de te compliquer la vie.

    En JavaScript les tableaux n'existent pas vraiment au sens stricte du terme comme dans les autres langages, ce sont des Objets, et on peut utiliser dessus une syntaxe comme pour les tableaux, si on veut, ou pas.
    mais il y a aussi toute un panoplie de m�thodes qui peuvent �tre utilis�es pour trier, parcourir, modifier les valeurs de mani�re conditionnelles etc..
    et tu a aussi la m�thode assign.

    => https://developer.mozilla.org/fr/doc.../Object/assign

  3. #3
    R�dacteur/Mod�rateur

    Avatar de SpaceFrog
    Homme Profil pro
    D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activit� : D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par d�faut
    Personnellement je r�fl�chirais diff�remment.
    J'indexerai chaque relev� avec une heure, soit dans un array litt�ral, soit dans un json
    Car si tu as � la suite dans ton arrays les relev�s et que tu n'en a que 3 sur 6 par exemple. Qu'est ce qui te permet de dire que ce sont les 3 premiers, les 3 derniers , ceux du milieux, les 1 - 4 - 6 ou les 2 - 3 - 4 ...

    Cela permet de lier un relev� � un temps donn� et ainsi g�rer les trous de relev�s
    Ma page Developpez - Mon Blog Developpez
    Pr�sident du CCMPTP (Comit� Contre le Mot "Probl�me" dans les Titres de Posts)
    Deux r�gles du succ�s: 1) Ne communiquez jamais � quelqu'un tout votre savoir...
    Votre post est r�solu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de D�veloppez !

  4. #4
    Invit�
    Invit�(e)
    Par d�faut
    bj,

    d�j� bravo pr avoir �t� clair la plupart des postes � rallonge sont souvent fumeux mais les steps pr reproduire �taient bien d�crites
    simplifions qd m�me les donn�es et la reproduction
    soient a,b,c trois arrays...de taille 4 (mais pourraient �tre de taille diff�rente...)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    var a = ['a','b','c','d']
    var b = ['a','c','e','h']
    var c = ['b','c','d','f']
    les lettres repr�sentent des dates (comprendre que elles respectent un ordre (ici alphab�tique)). Lettres parce que plus court, moins chiant � �crire.

    � chaque el de a est associ�e une valeur
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    val_a = [0,1,2,3]
    val_b = [4,0,2,3]
    val_c = [0,1,5,1]
    la demande de pierrot est de r�cup�rer les 3-uplets associ�s � chaque lettre

    ici
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    'a':<0,4,0> //la premiere valeur correspond au tableau a/val_a
    'b':<1,0,0>
    'c':<2,0,0>
    'd':<3,0,5>
    'e':<0,2,0>
    'f':<0,0,1>
    'h':<0,3,0>
    SI on s'embarque dans cette piste: on r�cup�re trivialement
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    labels_a = labels_b = labels_c = ['a',...',h']
    data_a = tuple(0)
    data_b = tuple(1)
    data_c = tuple(2)
    (o� tuple(x) repr�sente la colonne x)

    la construction des labels est ballourde
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var allData = [a,b,c]
    var dates = new Set([].concat(...allData))
    dates = [...dates].sort((x,y)=>x.localeCompare(y))
     
    la construction des tuples aussi
    var tuples = dates.map(l=>{
        //pas efficient, ne PAS faire
        return allData.map(ad=>{
            //si on a trouvé la date pour le jeu de donné "a"  
            return ad.find(lab=>lab==l) 
                || 0 //sinon on retourne 0
        })
    })
    je passe lextraction des valeurs....

    ---------
    concernant le pas efficient, ne PAS faire
    ca depend cb tu as de donn�s mais ici on constate tristement que � chaque date, tu vas parcourir TOUS les arrays.
    idem si tu as n tableaux de m elements (m �tant la taille la plus grande parmi tous tes tableaux) tu fais nxm ops, cqui d'une part peu �tre probl�matique , et d'autre part est triste pour un developpeur

    une possibilit� est (tout en conservant cette id�e) de directement consid�rer une map qui est directement construite... et qui repr�sente les tuples
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //tuples associe date=<indexDeLelemTrouve_a, indexDeLelemTrouve_b, ...>
    var tuples = allDates.reduce((acc,ad, i)=>{//i représente le ieme dataset
        ad.forEach((el, indexDeLelem)=>{
            //si le tuple existe déjà je ne le réinitialise pas
            //la subtilité/principe est ici que tester la présence de la date est logarithmique dans une map
            //alors que linéaire dans la premiere approche
            acc[el] = acc[el] || [-1,-1,-1]
            acc[el][i] = indexDeLelem
        })
        return acc;
    },{})//un objet cette fois, pas un array
    ne reste plus qu'� trier les tuples (qui pr linstant sont index�s par ordre de "trouv�"

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var sortedTuples = Object.keys(tuples).sort((a,b)=>a.localeCompare(b)).map(t=>{
        //a noter qu'ici notre tuple peut être de la forme [-1,0,1] qui signifie
        //pas de valeur pour val_a, prendre la valeur à l'index 0 pour val_b, et à l'index 1 pour val_c
        return tuples[t].map((t,i)=>{
            var idx = t[i]
            if( idx == 0 ) return -1
            return allValues[i][idx]
        })
    })
    note: on aurait pu directement construire tuples en une passe (au lieu de stocker l'indexDeLelem on peut directement stocker la valeur... j'ai d�coupl� pour simplicit�

    pr r�pondre stct � ta question sans passer par une variable interm�diaire (ici tuples), als tu peux cr�er la "encore pire" fonction qui est (pseudo code)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    pour chaque arr de allDates
        pour chaque arr2 de allDates, arr2 different de arr //!!!, O(n^2)
            pour chaque el de arr //!!!now O(mn^2)
                si el dans arr2 ne rien faire
                sinon
                    //now O(mlog(m)n^2)) si dichtomie...
                    ind = recuperer l'indice de l'élément dans arr2 dont la date est la plus proche de el et aussi de ns (temporellement)
                    arr2.splice(ind, 0, el) //on insère lelem à la position ind, on retire aucun élément
                    //on met un 0 dans le tableau des valeurs à la position ind
    je peux detailler le pseudo code si necessaire mais je marrete l� car la solution/approche est tres inelegante..

    ps: j'ai pas v�rifi� mon js mais tu as les grandes lignes
    Derni�re modification par NoSmoking ; 11/09/2018 � 10h42.

  5. #5
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par SpaceFrog Voir le message
    Personnellement je r�fl�chirais diff�remment.
    J'indexerai chaque relev� avec une heure, soit dans un array litt�ral, soit dans un json ...
    Personnellement, je suis d'accord avec SpaceFrog.

    Si tu gal�res autant, c'est certainement que ton syst�me est foireux mal con�u.
    Tu essaies de faire rentrer un cube dans un trou rond...


    Revoie la m�thodologie, en partant du constat que tu n'auras pas forc�ment le m�me nombre de donn�es, ni aux m�me dates.
    L'id�e de SpaceFrog d'indexer sur les dates me semble appropri�e, et fiable.


    Quant � la proposition de galerien69...
    Ce n'est pas la peine d'essayer de mettre un cataplasme sur une jambe de bois.

  6. #6
    Invit�
    Invit�(e)
    Par d�faut
    Ce n'est pas la peine d'essayer de mettre un cataplasme sur une jambe de bois.
    je vois pas trop en quoi c'est une jambe de bois.
    tu recuperes des valeurs de diverses sources. #spec
    chaque source te donne une liste de date, et une liste de valeurs. #spec
    ta librairie (ici graphique) t'impose de fournir un tableau label et un tableau values #

    je veux bien savoir comment tu fais.
    parce que t'as liste de valeur []... ou {} pour ta source i, ya un moment tu dois la croiser avec celle des autres sources. Meme combat.

    et si l'id�e derri�re la tete c'est de dire, utilise ta librairie (graphique) diff�remment (cqui est pe tout � fait recevable soit dit en passant), l'effort algorithmique est qd m�me "int�ressant" et rapidement prototypable... chez moi c'est 8 lignes... et 5min...
    faut-il s'en �carter en startup

Discussions similaires

  1. rechercher une valeur dans toutes les tables
    Par touness dans le forum D�buter
    R�ponses: 1
    Dernier message: 01/12/2011, 11h58
  2. R�ponses: 0
    Dernier message: 08/02/2011, 18h46
  3. La meme entete dans toutes les pages
    Par Elwe31 dans le forum ASP.NET
    R�ponses: 2
    Dernier message: 18/06/2008, 22h26
  4. R�ponses: 9
    Dernier message: 15/05/2007, 14h28
  5. R�ponses: 9
    Dernier message: 29/03/2006, 21h41

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