Au boulot, on s'est rendu compte que certaines données étaient réceptionnées depuis notre api en format " string " et exploitées de la même façon. En terme de performances, il vaut souvent mieux travailler au maximum avec des variables de type numérique lorsque cela est possible, sans compter le gain au niveau du transfert des données sur le réseau.
Cette fonction jQuery permet de transformer le contenu de n'importe quelle variable, array ou objet en numérique lorsque c'est possible.

Commentaires

Hum, la qualité de ce code est discutable. En effet, tout le monde s'accorde à dire qu'il ne faut pas itérer sur les éléments d'un tableau avec une boucle for/in même si, dans le cas présent, les problèmes potentiels (bug [DontEnum] pour IE < 9 et ordre des clefs dans l'itération [1]) n'engendrent pas de bugs.

En revanche le test pour vérifier si une valeur est de type objet peut donner de faux résultats, ainsi ce code va planter :
toNumeric(new String(8)) // TypeError: Cannot call method 'toNumeric' of undefined

De même, l'utilisation de parseInt et parseFloat me semble légèrement trop compliquée. L'appel à la fonction Number [2] aurait été plus simple et moins sujet aux bugs. Par exemple, ce code ne donnera pas le résultat voulu dans tous les navigateurs sauf Chrome :
toNumeric("08") // affiche 0
Ceci est du au fait que le second paramètre de la fonction parseInt peut être important dans certains cas de figures [3].

Enfin, je ne vois pas du tout pourquoi ce code "requiert" jQuery alors qu'il n'en utilise aucune fonctionnalités.

[1] https://groups.google.com/forum/?fromgroups=#!topic/jsmentors/2kmsNxOirFk
[2] https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number
[3] https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/parseInt#Octal_Interpretations_with_No_Radix

Il y a plus de 11 ans

Je te remercie pour tes commentaires pertinents. Ainsi que précisé dans le billet, cette fonction était perfectible, même si dans 95% des cas courants, elle fonctionne telle quelle. J'ai tenu compte de ceux-ci pour adapter la conversion en numérique. Par contre, je n'ai pas retenu ta première remarque afin de ne pas alourdir le code, le risque d'erreur étant nul lorsque connait un tant soit peu les données passées à la fonction. toNumeric(new String(8)) n'est certainement pas une situation logique. Libre aux utilisateurs d'étoffer le code suivant les besoins.
Quant au jQuery, il n'est bien entendu "requis" en aucune façon, j'ai modifié l'en-tête de fonction qui n'avait pas lieu d'être.

Il y a plus de 11 ans

Je te remercie à mon tour pour avoir pris en compte mes remarques. J'ajouterai que dans le cadre d'appels Ajax, quand le navigateur supporte l'objet JSON, ce type d'opération est assez simple avec Les méthodes JSON.parse et JSON.stringify et leur second paramètre qui permet d'intervenir sur le processus de sérialisation et désérialisation.

C'est documenté ici :
https://developer.mozilla.org/en-US/docs/Using_native_JSON#The_replacer_parameter
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON/parse#Description

Ce qui donne, par exemple, ce type de code pour sérialiser. Note : il ne transforme pas les les "," en "." et ne gère pas les valeurs Infinity et NaN qui ne sont pas valides en JSON :

function toNumber(key, val) {
return typeof val == "string" ? Number(val) || val: val;
}

JSON.stringify({ a: "1.7", b: "2", c: [ 8, "98","foo" ] }, toNumber);
// "{"a":1.7,"b":2,"c":[8,98,"foo"]}"

et pour désérialiser :

JSON.parse('{ "a":"1.7", "b":"2", "c":[ 8, "98", "foo" ] }', toNumber);
// { a:1.7, b: 2, c: [ 8, 98, "foo"] }

Il y a plus de 11 ans
Vous devez vous inscrire ou vous connecter pour poster un commentaire