Closed AnaelKremer closed 2 months ago
Après analyse, le problème est plus compliqué qu'il y parais, car il faut prendre en compte le contexte d'utilisation, car il peut être utilisé pour modifier une phrase donc le problème soulevait ici n'est pas forcément valide, mais dans le cas d'un tableau de référence qui ne marche pas le problème cité et pertinent, je préférer par m avant sur un fixe. Je l'aise la désistion à @touv
Il faut peut être spécifier (et décider de ) l'utilisation des différents transformers.
Pour modifier des mots ou des phrases je pense que replace et replaceregex sont davantage pertinents que mapping, que je vois plus comme utile pour de la verbalisation de codes ou d'identifiants.
De mémoire, le Transformer mapping a été ajouté pour verbaliser des codes, d'ailleurs la documentation est écrite dans ce sens https://www.lodex.fr/docs/documentation/principales-fonctionnalites-disponibles/transformer-des-donnees/
sauf pour l'exemple, qui laisse à penser à des remplacements de mots !!!
La correction de ce problème devrait faire en sorte d'éviter les remplacements en cascade.
Suite à notre discussion en live et donc sans pouvoir tester correctement mon code dans le bon environnement , je propose cette correction
return Object .keys(list) .reduce((currentValue, searchValue) => { const regex = new RegExp(
\b${searchValue}\b, 'g'); return currentValue.replace(regex, list[searchValue])}, value);
On ajoute une regex avec un délimiteur de mot qui permet de ne pas découper les chaînes en sous-chaînes. Mais la déclaration de ma constante n'est peut être pas au bon endroit...
Copie du message d'origine de @yanngui23 dans le canal mattermost :
Le transformer Mapping transforme effectivement plusieurs fois >
Je pense que cela est dû à l'utilisation de la fonction reduce dans le code et surtout au split effectué
return Object .keys(list) .reduce((currentValue, searchValue) => currentValue .split(searchValue) .join(list[searchValue]), value); };
dans l'exemple "US" a une équivalence, il transforme donc en "USA", qui devient le nouvel accumulateur.
.split(searchValue)
va ensuite découper "USA" en ["U","SA"] car "SA" est également dans le dictionnaire. Il remplace donc "SA" puis le join renvoie le "U" devant.Ces segmentations créent donc des "occurences imbriquées", qui peuvent donc être transformés x fois.