配列を受け取り、データ型ごとに分類したMapを返すJavaScript関数の作り方
混合したデータ型を含む配列を受け取り、要素をそれぞれのデータ型ごとにグループ化した Map を返す関数 classifyArray() を作成することを考えてみましょう。
要件の例
// 入力配列が以下の場合:
const arr = ['class', 2, [7, 8, 9], {"name": "Michael"}, Symbol('foo'),
true, false, 'name', 6];
// 出力されるMapは次のようになります:
Map(5) {
'string' => [ 'class', 'name' ],
'number' => [ 2, 6 ],
'object' => [ [ 7, 8, 9 ], { name: 'Michael' } ],
'symbol' => [ Symbol(foo) ],
'boolean' => [ true, false ]
}コード例
この関数は、Array.prototype.reduce() メソッドと Map オブジェクトを組み合わせることで簡潔に実装できます。各要素に対して typeof 演算子でデータ型を判定し、その型をキーとして要素を振り分けていきます。
const arr = ['class', 2, [7, 8, 9], {"name": "Michael"}, Symbol('foo'),
true, false, 'name', 6];
const classifyArray = arr => {
return arr.reduce((acc, val) => {
const previousData = acc.get(typeof val);
if(previousData){
acc.set(typeof val, [...previousData, val]);
}else{
acc.set(typeof val, [val]);
};
return acc;
}, new Map());
};
console.log(classifyArray(arr));実行結果
コンソールには次のように出力されます。
Map(5) {
'string' => [ 'class', 'name' ],
'number' => [ 2, 6 ],
'object' => [ [ 7, 8, 9 ], { name: 'Michael' } ],
'symbol' => [ Symbol(foo) ],
'boolean' => [ true, false ]
}コードの解説
この実装の処理の流れは以下のとおりです。
reduce()の初期値として空のnew Map()を渡します。- コールバック関数内で
typeof valによって現在の要素のデータ型を取得します。 acc.get()で同じ型のキーがすでに存在するかを確認します。- キーが存在する場合は、スプレッド構文
[...previousData, val]を使って既存の配列に新しい要素を追加します。 - キーが存在しない場合は、新しいキーとして対象の要素を1つだけ持つ配列をセットします。
最終的に、データ型名をキー、その型に属する要素の配列を値とする Map が返されます。なお、null や配列も typeof では 'object' として判定されるため、より厳密な分類が必要な場合は Array.isArray() などを併用するとよいでしょう。
-
JavaScriptで関数を呼び出す方法をわかりやすく解説
JavaScriptでは、独自の関数(ユーザー定義関数)を作成することができます。一度定義した関数は、スクリプト内の後の任意の場所で関数名()と記述するだけで簡単に呼び出せます。 関数を呼び出すサンプルコード 以下のコードでは、「Say Hello」ボタンをクリックするとsayHello関数が実行され、画面にメッセージが表示されます。実際にブラウザで動かして、JavaScriptにおける関数の呼び出し方を確認してみましょう。 <html> <head> <script> &
-
JavaScript関数からオブジェクトを返す方法をわかりやすく解説
JavaScriptの関数からオブジェクトを返すには、return文を使用します。オブジェクト内のプロパティやメソッドにアクセスする際は、thisキーワードを活用すると便利です。この記事では、実際のコード例を使いながら、JavaScript関数からオブジェクトを返す基本的な方法を解説します。基本的な考え方JavaScriptでは、オブジェクトの中にメソッド(関数)を定義できます。そのメソッド内でreturn文を使えば、処理結果や値を呼び出し元に返すことができます。また、thisキーワードを参照することで、同じオブジェクト内の他のプロパティにアクセス可能です。サンプルコード以下のコードでは、従業