Partage
  • Partager sur Facebook
  • Partager sur Twitter

[POO] récupérer le nom d'un paramètre

suivant sa clé pour manipuler les données d'un tableau

    5 décembre 2018 à 19:59:08

    Bonjour,

    pour apprendre la recursivité, on m'a donné au travail l'exercice suivant: 

    (exercice fait sous nodejs avec  du vue.js et le framework quasar en mode cordova / android)

    //le fichier.json d'origine
    {
      "mesAmis": [
        {
          {
            "nom": "fou",
          "prenom": "foup",
          "parents":  {
            "mere" : "ginette"
            "pere": "albert"
          },
          "photo": "coucou.jpg"
        },
        {..etc..}
      ]
    }

    J'ai commencé par transformer le fichier en objet javascript avec JSON.parse() -> ok

    Je l'appelle monObjet

    puis lister toutes les valeurs finissant par ".jpg"

    Dans ma logique, j'avance par les key:
    verifier si la key est un objet ou pas. 

        for (n = 0; n < Object.keys(monObjet).length; n++) {
          Object.is(typeof v, 'object')
            ? Array.isArray(v)
              ? console.log('its an array : @todo complete the path and recursive it')
              : console.log('NOT an array ' + '  @todo: add each key at path et recursive it')
            : console.info('this param have ' + v + ' as value @todo: take the path -1 et param name')
          console.log('key is ' + n)
        }
    //ceci est une ébauche, les console.log me sert juste de réponse en attendant d'implémenter la suite.

    Je voulais passer de monObjet[0] à monObjet.mesAmis[0] donc je me suis dis qu'il fallait que je réecrive  le chemin à chaque fois, sinon je n'arriverai pas à faire de ma fonction une recursive

    le problème, c'est que je n'arrive pas à attraper le nom d'un paramètre suivant sa key en un minimum lignes.

    La demander en monObjet[0].name ne me renvoit rien, et au mieux j'arrive à renvoyer la liste de tous les noms de parametres avec Object.getOwnPropertyNames par exemple, ca me sort une liste. Je dois surtout pas en faire un nouveau tableau sinon je tombe dans la recursivité de mon problème :D

    Faut donc bidouiller en découpant la string. Rien de très propre ni d’efficace. Je suis persuadé qu'il existe une solution plus fluide. 

    Sinon, j'ai trouvé une autre méthode pour mon listing sur stackoverflow que je vous joint en annexe. J'ai encore beaucoup à apprendre, mais je serai peut-être un jour confronté à ce genre de situation, j'aimerai bien connaître la solution conseillée

    Je suis désolé je ne poste pas souvent alors je sais pas si je respecte les règles de publication et si je suis compréhensible. N'hésitez pas à poser des questions :)

    https://stackoverflow.com/questions/2549320/looping-through-an-object-tree-recursively 

    function eachRecursive(obj){for(var k in obj){if(typeof obj[k]=="object"&& obj[k]!==null) eachRecursive(obj[k]);else// do something... }}
    • Partager sur Facebook
    • Partager sur Twitter
      5 décembre 2018 à 20:30:03

      Haha !!

      La méthode magique c'est Object.keys(monObjet)

      Tu récupères un tableau de toutes les clés, tu peux ensuite boucler dessus et récupérer leur valeur une par une avec par exemple:

      Object.keys(monObjet).forEach( function(key){
        console.log(monObjet[key])
      })

      Tu peux arriver au même résultat avec for( let key in monObjet) {} aussi.


      Edit: je met "Haha !!" c'est parce que c'est trop cool ton exo, ça m'enthousiasme.

      -
      Edité par Todostaky 5 décembre 2018 à 20:32:32

      • Partager sur Facebook
      • Partager sur Twitter
        6 décembre 2018 à 0:29:50

        woaw merci !

        J'ai le souvenir d'avoir .forEach cet après midi sans succès, mais il me semble que je l'ai pas utilisé correctement, j'ai du faire un Object.forEach et je sais pas quel truc derrière. Je vais pouvoir continuer ma version de l'exercice de mon côté maintenant. 

        La suite de l'exercice, maintenant, c'est de modifier les paramètres selectionnés, car dans l'idée générale il s'agit de:

        1. récupéré sur une API le Json qui contient les liens vers les images (stockées en externe).

        2. récupéré les liens de ces images ( ce topic!)

        3. les télécharger en local :

                                et comme ça concerne android, dans les dossiers cachés du "persistent" (l'équivalent du localstorage) 

                                bonus: en créant des dossiers du genre cdvfile://localhost/persistent/assets/monObjet/id/coucou.jpg

        4. Editer le Json local pour y insérer l'url de l'image en local. 

        5. la faire afficher

        J'ai fais l'étape 3, j'ai juste à faire le "bonus" du coup, ca va être l'occasion de tester ta solution.

        Les 4 et 5 sont des formalités :)

        En un exercice décomposé je découvre les promesses, je mets un pied dans la récursivité, et je m'arrache les cheveux sur les frameworks et leur compatibilité. 

        Les règles es-lint sont parfois frustrantes, mais réussir à enchainer un grand nombre de lignes sans se faire "sanctionner" est un défi formateur.

        A noter que sur la version Stackoverflow, il faut desactiver es-lint sur la ligne 5, car es-lint veut un " === " quitte à transformer en brique la fonction. 

                if (typeof obj[k] == "object" && obj[k] !== null)
        function eachRecursive(obj)
        {
            for (var k in obj)
            {
                if (typeof obj[k] == "object" && obj[k] !== null)
                    eachRecursive(obj[k]);
                else
                    // do something... 
            }

        Encore merci !

        • Partager sur Facebook
        • Partager sur Twitter
          6 décembre 2018 à 11:47:16

          Les règles es-lint tu peux les modifier à priori si elles te gène. En vrai je te le conseille pas vraiment, sauf pour les règles dont tu peux vraiment justifier la suppression. La règle "eqeqeq" (à vérifier dans la doc d'eslint) est surtout faites pour ne pas perdre ceux qui viennent d'autres langages. Mais si tu as bien compris la différence entre "==" et "===", les types et la coercion, les résultats quand tu testes des Object avec null, des Object avec des Array ... alors pour moi ça appauvris surtout le JS. "==" c'est une fonctionnalité intéressante.

          Bref, normalement tu as un .eslintrc

          Si c'est pas le cas parce qu'il est importé dans node_modules ou dans ton éditeur de texte, tu peux le créer, celui de ta racine a normalement la priorité, tu peux donc en modifier les règles.

          • Partager sur Facebook
          • Partager sur Twitter

          [POO] récupérer le nom d'un paramètre

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown