2013-05-18 10 views
5

Warum passiert das?parseInt funktioniert nicht korrekt, wenn es als Argument für einen Kartenaufruf übergeben wird

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 ] 

Aber Array.prototype.map.call(numbers, parseInt); kehrt [ 1, 2, 3, 4];. Ich verwende diesen Code in Google Chrome 26.0.1410.65.

+6

erklärt bei https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map –

+0

auch einfache Lösung: 'numbers.map (function (i) {ParseInt zurückkehren (i)}) ' – Jonah

+0

Vergessen Sie auch nicht, den radix-Parameter immer an' parseInt() 'zu übergeben und setzen Sie ihn auf '10', wenn Sie die Basis 10 verwenden, weil Sie sonst wahrscheinlich sind seltsame und sehr schwer zu debuggende Probleme später zu begegnen. – rid

Antwort

4

Der Link auf die richtige Antwort in den Kommentaren gegeben, aber ich will es hier posten:

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

Während ein [1, 2, 3]

Das tatsächliche Ergebnis ist [1, NaN, NaN]

erwarten könnte parseInt wird oft mit einem Argument verwendet, benötigt aber zwei Argumente. Die zweite die Radix, um die Funktion Rückruf ist, übergibt Array.prototype.map 3 Argumente: das Element, um den Index, um das Array

Das dritte Argument von ParseInt ignoriert wird, aber nicht die zweite, also die mögliche Verwirrung.

Quick Fix

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


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

Tatsächliches Ergebnis eine Reihe von Zahlen ist (wie erwartet)

0

https://developer.mozilla.org/en-GB/docs/JavaScript/Reference/Global_Objects/Array/map erklärt, wie Karte funktioniert.

Ich finde es einfacher mit der Lösung, die Jonah vorgeschlagen, eine Rückkehr-Funktion für was Sie, anstatt sie zu werfen ..

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

Der wahre Grund abbilden wollen erstellen ist, dass Sie versuchen, eine Funktion zu füttern zu mappen, aber JS bekommt die Funktion nicht richtig.

Sie deklarieren besser die Funktion und füttern sie dann.

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

var intN2 = numbers.map(titi); 
+1

Es ist nicht notwendig, die Funktion im Voraus zu deklarieren. Sie müssen "parseInt" nicht direkt verwenden. –

Verwandte Themen