2013-06-26 4 views
0

J'ai un tableau de chaînes que j'ai besoin de convertir en un tableau de nombres avec des nombres décimaux. Le tableau de chaînes ressemble à ceci:Pourquoi JavaScript parseFloat ajoute-t-il une valeur supplémentaire à la boucle?

var array = [" 169.70", " 161.84", " 162.16", " 176.06", " 169.72", " 170.77", " 172.74", " 175.73", " 0.00", " 0.00", " 0.00", " 0.00"] 

J'ai créé une courte fonction pour analyser chaque élément de tableau qui va comme ceci:

function parseFloatArray(array) { 
    var parsedArray = []; 
     for (var i = 0; i < array.length ; i++) { 
      parsedArray[i] = parseFloat(array[i]); 
      parsedArray.push(parsedArray[i]);   
      console.log(parsedArray[i]); 
     }; 
    return parsedArray; 
} 

Logging array.length me donne une valeur de 12. La se connecter à la boucle for renvoie également 12 valeurs individuelles. Cependant, console.log (parsedArray) me donne le tableau suivant avec une longueur de 13 (Notez le zéro de fuite):

[169.7, 161.84, 162.16, 176.06, 169.72, 170.77, 172.74, 175.73, 0, 0, 0, 0, 0] 

Toute réflexion sur la façon dont je peux améliorer cette fonction et pourquoi il serait ajouter un zéro, malgré tous les journaux montrant 12 valeurs?

+1

Essayez 'array.map (parseFloat)' ;) – georg

+0

Vous assignez * et * en poussant? FYI, 'array.map (parseFloat)' est plus propre. EDIT: ... comme thg435 a dit. : D –

+0

Oh, le débutant créant un travail supplémentaire pour lui-même. Merci pour l'astuce array.map (parseFloat). Fonctionne magnifiquement. – thefreeline

Répondre

2

Il peut être une bonne utilisation de la carte de la méthode de tableau, qui renvoie un nouveau tableau de la valeur de chaque article retourné d'une fonction (par exemple, parseFloat):

var array= [" 169.70", " 161.84", " 162.16", " 176.06", " 169.72", 
" 170.77", " 172.74", " 175.73", " 0.00", " 0.00", " 0.00", " 0.00"]; 

var parsedArray= array.map(parseFloat); 
>>>value: (Array)  
[169.7, 161.84, 162.16, 176.06, 169.72, 170.77, 172.74, 175.73, 0, 0, 0, 0]; 

Si vous devez prendre en charge IE < 9, vous pouvez fournir un sous pour carte-

Array.prototype.map= Array.prototype.map || function(fun, scope){ 
    var T= this, L= T.length, A= Array(L), i= 0; 
    if(typeof fun== 'function'){ 
     while(i<L){ 
      if(i in T){ 
       A[i]= fun.call(scope, T[i], i, T); 
      } 
      ++i; 
     } 
     return A; 
    } 
} 
0

Il suffit de les mettre une fois:

function parseFloatArray(array) { 
    var parsedArray = []; 
    for (var i = 0; i < array.length; i++) { 
     parsedArray.push(parseFloat(array[i])); 
    } 
    return parsedArray; 
} 
+0

J'ai accepté cette réponse parce qu'elle résout le problème. J'aime les suggestions .map (parseFloat) dans les commentaires à la publication originale. – thefreeline

Questions connexes