# Notes
Pour transformer le json d'origine, on itérera sur le fichier pour le scinder en deux 
on utilise le tools ici : https://jsoneditoronline.org/#right=cloud.f0a19b92543d4c7fa1bdb58a913707e8&left=local.xoliwi

##### Pour avoir le json en francais:
*Cette version de la fonction query utilise une récursion pour explorer les sous-objets de chaque objet dans la liste data. La fonction checkKey transforme les clés se terminant par "_fr" en supprimant cette terminaison, et elle vérifie si la clé contient un nombre avant de traiter ses sous-objets. Si la clé ne contient pas de nombre, la fonction ne traite pas les sous-objets de cette clé.*
```js
function query(data) {
  function checkKey(obj) {
    obj = _.mapKeys(obj, (value, key) => {

      if (_.endsWith(key, "_fr") ) {
        return key.slice(0, -3);
      }
      return key;
    });
    for (const [key, value] of Object.entries(obj)) {
      if (_.isObject(value) && isNaN(value) ) {
        obj[key] = checkKey(value);
      }
    }
    return _.pickBy(obj, (value, key) => !_.endsWith(key, "_en"));
  }

  return _.chain(data)
    .map(obj => checkKey(obj))
    .value();
}




```

##### Pour deplacer les classes dans un objet "classes"
```js
function query(data) {
  return _.chain(data)
    .map(item => {
      const {
        bard = "",
        cleric = "",
        druid = "",
        paladin = "",
        ranger = "",
        scholar = "",
        sorcerer = "",
        warlock = "",
        wizard = "",
        ...rest
      } = item;
      return {
        ...rest,
        classes: {
          bard,
          cleric,
          druid,
          paladin,
          ranger,
          scholar,
          sorcerer,
          warlock,
          wizard
        }
      };
    })
    .value();
}
```


##### pour renommer les components :
```js
function query(data) {
  return _.chain(data)
    .map(obj => {
      // Renommer les clés spécifiées
      obj = _.mapKeys(obj, (value, key) => {
        switch(key) {
          case "composite_oral":
            return "v";
          case "composite_moves":
            return "s";
          case "composite_material":
            return "m";
          case "material_components_fr":
            return "m_fr";
          case "material_components_en":
            return "m_en";
          case "composite_material_destroyed":
            return "m_destroyed"
          default:
            return key;
        }
      });
      return obj;
    })
    .value();
}
```

##### Pour deplacer les components dans un objet "components"
```js
function query(data) {
  return _.chain(data)
    .map(item => {
      const {
        m_destroyed = "",
        v = "",
        s= "",
        m= "",
        m_fr= "",
        m_en= "",
        ...rest
      } = item;
      return {
        ...rest,
        components: {
          m_destroyed,
          v,
          s,
          m,
          m_fr,
          m_en,
        }
      };
    })
    .value();
}
```

##### Pour ajouter recid et source 
```js
function query(data) {
  return _.chain(data)
    .map((item, index) => _.merge({ recid: index }, item))
    .map((item, index) => _.merge({ source: "GRI01" }, item))
    .value();
}
```

##### Pour transformer les clé 0/1 en true/false
```js
function query(data) {
  return _.chain(data)
    .map((item) => ({
      ...item,
      composite_material_destroyed: item.composite_material_destroyed = "x"? true : false,
      composite_oral: item.composite_oral == 1? true : false,
      has_higher_level_details: item.has_higher_level_details == 1? true : false,
      ritual: item.ritual == 1? true : false,
      dragons_exclusive: item.dragons_exclusive == 1? true : false,
      composite_moves: item.composite_moves == 1? true : false,
      composite_material: item.composite_material == 1? true : false,
      corrupted: item.corrupted == 1? true : false,
      concentration: item.concentration == 1? true : false,
    }))
    .value();
}
```