[JS]配列の巡回メソッド forEach, map, reduce, reduceRight
JavaScriptのArrayオブジェクトの巡回メソッドには、forEach、map、reduce、reduceRightがあります。配列の各要素に対して繰り返し処理を行うことができます。それぞれの違いと使い分けについて、解説します(サンプルあり)。
forEach:汎用
forEachメソッドは、配列の各要素に対して、指定したコールバック関数の処理を行います。
コールバック関数は、第1引数で要素の値、第2引数でインデックス、第3引数で配列そのものを受け取ります。
繰り返し処理で、元の配列の値を更新する場合は、第3引数で指定した配列の要素に値を設定します。
forEachメソッドは汎用性が高く、どんな配列巡回処理も記述できますが、使用する優先度は最も低いと考えた方がいいでしょう。
forEachメソッドのコールバック関数は、for-of文のように、break文やcontinue文で抜けることができません。
また、JavaScriptには、特定の機能に特化した便利な配列コールバック系メソッドが多くあるため、まずは、それらで記述できないかどうか検討するべきです。
配列要素の繰り返し処理を記述する際の優先順位は、以下になります。
- forEach以外の配列コールバック系メソッド
- for-of文
- forEachメソッド
配列のコールバック系メソッド一覧
- mapメソッド:巡回処理で配列を生成
- reduceメソッド、reduceRightメソッド:巡回処理で一つの値を取得
- filterメソッド:条件式で配列を抽出
- findメソッド、findIndexメソッド:条件式で配列を検索
- someメソッド、everyメソッド:条件式で要素の存在チェック
配列.forEach(( 値, インデックス, 元の配列 ) => {
繰り返し処理;
});
サンプル
const members = [
{ name: '江藤', position: 'PM' },
{ name: '佐藤', position: 'SE' },
{ name: '須藤', position: 'PG' },
];
members.forEach((member, i, ary) => {
ary[i].id = `${member.position}${i}`;
});
console.log(members);
/*「[
{ name: '江藤', position: 'PM', id: 'PM0' },
{ name: '佐藤', position: 'SE', id: 'SE1' },
{ name: '須藤', position: 'PG', id: 'PG2' }
]」*/
map:巡回処理で配列を生成
mapメソッドは、配列の各要素に対して、指定したコールバック関数の処理を行い、その結果を配列として返します。
mapメソッドのコールバック関数は、値を返す必要があります。
コールバック関数は、第1引数で要素の値、第2引数でインデックス、第3引数で配列そのものを受け取ります。
mapメソッドは、呼び出した配列そのものには、影響を与えません。
配列.map(( 値, インデックス, 元の配列 ) => {
繰り返し処理;
return 結果;
});
サンプル
const members = [
{ name: '江藤', position: 'PM' },
{ name: '佐藤', position: 'SE' },
{ name: '須藤', position: 'PG' },
];
console.log(members.map(member => `${member.name}(${member.position})`));
//「[ '江藤(PM)', '佐藤(SE)', '須藤(PG)' ]」
reduce, reduceRight:巡回処理で1つの値を取得
reduceメソッドは、配列の各要素に対して、指定したコールバック関数の処理を行い、その結果を一つの値として返します。
reduceRightメソッドは、配列の末尾から、繰り返し処理を行います。
コールバック関数は、第1引数で前回の実行結果、第2引数で要素の値、第3引数でインデックス、第4引数で配列そのものを受け取ります。
reduceメソッドの第2引数は、実行結果の初期値を指定します。
第2引数を省略した場合は、配列の先頭要素の値が、実行結果の初期値となり、2番目の要素から巡回処理が実行されます。
第2引数を省略すると、以下のような動作となるため、省略しない方がいいでしょう。
- 空配列がreduceメソッドを呼び出すと、TypeErrorが発生する。
- 要素が1つの配列が呼び出すと、処理が一度も実行されない。
配列.reduce(( 前回の実行結果, 値 ) => {
繰り返し処理;
return 結果;
}, 実行結果の初期値);
サンプル
const array = [0, 1, 2, 3, 4];
console.log(array.reduce((result, v) => result += v, 0));
//「10」
console.log(array.reduce((result, v) => result += v, ''));
//「01234」
console.log(array.reduceRight((result, v) => result += v, ''));
//「43210」
まとめ
JavaScriptの配列の巡回メソッドについて、解説しました。
それぞれの用途は、以下のようになります。
- forEach:汎用
- map:巡回処理で配列を生成
- reduce:巡回処理で一つの値を取得
- reduceRight:巡回処理で一つの値を取得(末尾から)