2013-10-31 30 views
4

我解決上codewars的一些問題,並試圖將字符串轉換爲這樣的號碼清單:Javascript地圖奇怪的行爲

"102904".split("").map(parseInt); 

預期的結果會是這樣的:

[1, 0, 2, 9, 0, 4] 

但它返回代替:

[1, NaN, NaN, NaN, 0, 4] 

相信地圖應該適用於列表中的每個元素重新設置1位數的字符串。有人可能會認爲,這是不正確解析,因爲不使用的基礎,但:

"102904".split("").map(function(x){ return parseInt(x);}); 
[ 1, 0, 2, 9, 0, 4] 

使用parseInt(x, 10),不改變結果。但直接parseInt發送到地圖創建NaN ...

我試過Chrome和Firefox,我收到了相同的結果。

+1

我不知道是什麼你問。 ''102904「.split(」「)。map(function(x){return parseInt(x);});'似乎在Chrome 30中返回預期結果。 – Jasper

+0

是的,我會刪除它,但是SO告訴我我不能... –

回答

1

作爲回調來Array.prototype.map提供的函數接收三個參數:從陣列

  • 元件
  • 陣列中的索引
  • 數組本身

如果提供兩個參數parseInt,第二個作爲基數–作爲解析數字的基數。所以你的字符串是pa RSED這樣

string | base | result 
---------------------- 
1  | 0 | 1 
0  | 1 | NaN 
2  | 2 | NaN 
9  | 3 | NaN 
0  | 4 | 0 
4  | 5 | 4 

這裏的令人驚訝的行爲是,使用鹼0(這是不可能的),結果是1而非NaN。這是因爲parseInt治療的0一個基數,如果它不提供:

如果基數是未定義或0(或不存在),JavaScript的假設:(MDN docs)

+0

是的我忘了那個地圖發送3個參數。 –

7

parseInt涉及第二個參數 - 基數。

你的問題是 - map發送給參數:item本身和索引。

問題的數字是:0, 2, 9

爲什麼?

  • 0 - 已通過基數爲1 1不是合法的基數所以NaN
  • 2 - 已基數爲2。通過在第2基板2,不提供位(0和1 是)
  • 9 - 已作爲基數3.傳遞仍然9是不是一個有效數(0,1和2是 )
1
"102904".split("").map(function(x, y){ console.log(x, y) }); 

返回

1 0 
0 1 
2 2 
9 3 
0 4 
4 5 

這意味着,在你的第一個例子,parseInt被調用是這樣的:

parseInt("1", 0); 
parseInt("0", 1); 
parseInt("2", 2); 
parseInt("9", 3); 
// ecc... 

你通過迭代的指數作爲第二個參數parseInt()(代表數字的基數被解析)。


最好的解決方案是使用第二種方法,使用已發佈的代碼。

+0

是的,我在廚房,並意識到,js發送多個參數映射不像其他功能語言.. –