4

コードウォーズでいくつかの問題を解決していて、文字列を次のような数字のリストに変換しようとしました:

"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 を map に直接送信するとNaN...

Chrome と Firefox で試しましたが、同じ結果が得られました。

4

3 に答える 3

7

parseInt2 番目の引数 - 基数が含まれます。

あなたの問題は -map引数に送信することです:アイテム自体とインデックス。

問題の数字は次のとおりです。0, 2, 9

なんで ?

  • 0 - 基数が 1 として渡されました。1 は有効な基数ではないため、NaN
  • 2 - 基数は 2 として渡されます。
  • 9 - 基数が 3 として渡されました。それでも、9 は有効な数字ではありません (0、1、および 2 は有効です)。
于 2013-10-31T15:30:44.427 に答える
1

へのコールバックとして提供される関数は、次のArray.prototype.map3 つの引数を受け取ります。

  • 配列の要素
  • 配列内のインデックス
  • 配列自体

に 2 つの引数を指定するparseIntと、2 番目の引数は基数 (数値を解析する基数) として扱われます。つまり、文字列は次のように解析されます。

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

ここでの驚くべき動作は、base を使用すると0(これは不可能です)、結果は.1ではなくNaN. これは、基数が指定されていないかのようにparseInt扱うためです。0

基数が未定義または 0 (または存在しない) の場合、JavaScript は次のことを想定します: (MDN ドキュメント)

于 2013-10-31T15:34:42.670 に答える
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...

反復のインデックスを 2 番目のパラメーターとしてparseInt()(解析する数値の基数を表します) に渡します。


最善の解決策は、既に投稿したコードで 2 番目のアプローチを使用することです。

于 2013-10-31T15:32:29.397 に答える