6 votes

ParseInt se comporte mal lorsqu'il est passé en argument à un appel de map

Pourquoi cela se passe-t-il?

var numbers = [ '1', '2', '3', '4' ];
var intNumbers = numbers.map( parseInt ); // intNumbers = [1, NaN, NaN, NaN]
var fltNumbers = numbers.map( parseFloat ); // fltNumbers = [1, 2, 3, 4, 5 ]

Mais Array.prototype.map.call( numbers, parseInt ); renvoie [1, 2, 3, 4];. Je lance ce code dans Google Chrome 26.0.1410.65.

4voto

Yuriy Points 418

Le lien vers la réponse correcte est donné dans les commentaires, mais je veux le poster ici :

["1", "2", "3"].map(parseInt);

Alors qu'on pourrait s'attendre à [1, 2, 3]

Le résultat réel est [1, NaN, NaN]

parseInt est souvent utilisé avec un seul argument, mais en prend deux. Au callback de fonction, Array.prototype.map passe 3 arguments : l'élément, l'index, le tableau

Le troisième argument est ignoré par parseInt, mais pas le deuxième, d'où la possible confusion.

Correction rapide

function returnInt(element){
   return parseInt(element,10);
}

["1", "2", "3"].map(returnInt);

Le résultat réel est un tableau de nombres (comme prévu)

0voto

Juan Vilar Points 138

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/map explique comment fonctionne map.

Je trouve plus facile la solution proposée par Jonah, créer une fonction de retour pour la chose que vous voulez mapper au lieu de la jeter.

intN = numbers.map(function(i) { return parseInt(i) });

La vraie raison est que vous essayez de donner une fonction à map, mais JS ne reçoit pas correctement la fonction.

Il vaut mieux déclarer la fonction d'abord, puis l'alimenter.

var titi = function(i) { return parseInt(i); };

var intN2 = numbers.map(titi);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X