JavaScriptで数値変換を使いこなす!map関数、parseInt関数、Number関数の違い

2024-04-08

JavaScriptのmap関数とparseInt関数とNaN

例えば、以下のコード:

const arr = ['1', '2', '3'];
const result = arr.map(parseInt);
console.log(result); // [1, NaN, NaN]

このコードを実行すると、result[1, NaN, NaN]という結果になります。

なぜこのような結果になるのでしょうか?

問題の原因

この問題の原因は、parseInt関数が引数として渡された文字列全体を解析しようとする点にあります。

map関数は、配列の各要素に対して関数を適用し、新しい配列を生成します。上記のコードでは、parseInt関数が各要素に適用されます。

parseInt関数は、最初の数値文字列を見つけ、それを10進数に変換します。しかし、数値文字列以外が見つかった場合は、NaN (Not a Number) を返します。

上記の例では、最初の要素 "1" は数値文字列なので、parseInt関数は正常に1を返します。

しかし、2番目と3番目の要素 "2" と "3" は数値文字列のみで構成されていません。これらの要素には空白文字が含まれているため、parseInt関数はNaNを返します。

解決方法

この問題を解決するには、parseInt関数に2番目の引数を渡す必要があります。2番目の引数は、解析対象となる文字列の基数を指定します。

const arr = ['1', '2 ', '3 '];
const result = arr.map(parseInt);
console.log(result); // [1, NaN, NaN]

これは、parseInt関数がデフォルトで10進数を基数として解釈するためです。空白文字は10進数には含まれないため、parseInt関数はNaNを返します。

以下のコードのように、2番目の引数に10を指定することで、空白文字を含む文字列も10進数として解析することができます。

const arr = ['1', '2 ', '3 '];
const result = arr.map(parseInt.bind(null, 10));
console.log(result); // [1, 2, 3]

このように、parseInt関数に2番目の引数を渡すことで、map関数と組み合わせて使用しても期待通りの結果を得ることができます。

  • 数値文字列以外が見つかった場合は、NaNを返す。
  • parseInt関数に2番目の引数を渡すことで、基数を指定することができる。



// 配列を定義
const arr = ['1', '2 ', '3 '];

// map関数を使って、各要素をparseInt関数で変換
const result = arr.map(parseInt);

// 結果を出力
console.log(result); // [1, NaN, NaN]
// map関数を使って、各要素をparseInt関数で変換
const result = arr.map(parseInt.bind(null, 10));

// 結果を出力
console.log(result); // [1, 2, 3]

以下のコードは、map関数とparseInt関数を使って、様々な基数の文字列を数値に変換する例です。

// 2進数を10進数に変換
const binary = ['1001', '1100', '1111'];
const decimal = binary.map(parseInt.bind(null, 2));
console.log(decimal); // [9, 12, 15]

// 8進数を10進数に変換
const octal = ['010', '011', '012'];
const decimal = octal.map(parseInt.bind(null, 8));
console.log(decimal); // [8, 9, 10]

// 16進数を10進数に変換
const hexadecimal = ['0x10', '0x11', '0x12'];
const decimal = hexadecimal.map(parseInt.bind(null, 16));
console.log(decimal); // [16, 17, 18]

このコードを実行すると、以下の結果になります。

[9, 12, 15]
[8, 9, 10]
[16, 17, 18]



map関数とparseInt関数以外で配列の各要素を数値に変換する方法

forEachループを使って、配列の各要素を処理することができます。

const arr = ['1', '2 ', '3 '];
const result = [];

arr.forEach(function(element) {
  result.push(parseInt(element, 10));
});

console.log(result); // [1, 2, 3]

このコードは、forEachループを使って、配列の各要素を処理し、parseInt関数を使って数値に変換しています。

const arr = ['1', '2 ', '3 '];
const result = arr.reduce(function(accumulator, currentValue) {
  return accumulator.concat(parseInt(currentValue, 10));
}, []);

console.log(result); // [1, 2, 3]

Number()関数を使って、文字列を数値に変換することができます。

const arr = ['1', '2 ', '3 '];
const result = arr.map(Number);

console.log(result); // [1, 2, 3]

このコードは、Number()関数を使って、配列の各要素を数値に変換しています。

Number()関数は、parseInt関数よりも簡潔に記述できますが、基数を指定することはできません。

map関数とparseInt関数以外にも、配列の各要素を数値に変換する方法はいくつかあります。

それぞれの方法にはメリットとデメリットがありますので、状況に合わせて使い分けることが重要です。


javascript


【超解説】JavaScriptでアニメーションを作る! requestAnimationFrame vs setInterval vs setTimeout

JavaScriptで一定間隔で処理を実行する場合、主に setInterval と再帰呼び出し setTimeout の2つの方法が用いられます。それぞれ異なる動作と特徴を持つため、適切な場面を選択することが重要です。setInterval...


Node.jsで出力を行う:process.stdout.writeとconsole.logの違い

process. stdout. write: 標準出力 (stdout) に直接出力します。console. log: 標準出力 (stdout) と標準エラー出力 (stderr) の両方にデフォルトで出力します。process. stdout...


Google Chrome DevTools で jQuery のソースマップを有効にする方法

この問題は、以下の 2 つの原因が考えられます。ファイルの欠損: jquery-1.10. 2.min. map ファイルがプロジェクトに存在していない、または誤って削除された可能性があります。以下の方法で問題を解決できます。ファイルの追加...


Create React Appでdotenvを使う

詳細:ブラウザはローカルやサーバーの環境変数にアクセスできないため、dotenv は本来ブラウザでは動作しません。しかし、Webpack を用いることで React アプリケーションで dotenv を利用することができます。方法:Create React App でプロジェクトを作成すると、dotenv パッケージがデフォルトでインストールされます。この場合、以下の手順で...


Vue.js CLIプロジェクトで開発サーバーのポート番号を変更する方法

そこで今回は、Vue. js CLIプロジェクトでポート番号を変更する方法を、2つの方法に分けて詳しく解説します。方法1:vue. config. jsファイルを使用するプロジェクトルートディレクトリに移動します。vue. config. js ファイルが存在しない場合は、以下のコマンドで作成します。...