今回は、Node.jsでforEachを使った配列処理について学習を進めていきましょう!
「そもそもforEachって何?」
「配列を効率よく処理する方法を知りたい」
「forEachよりも効率の良いNode.jsモジュールを知りたい」
このような内容も含めて、本記事では以下のような構成で解説していきます!
【基礎】「forEach」の使い方
【実践】asyncモジュールの活用
この記事で、forEachをしっかり学習してスキルアップを目指していきましょう!
「forEach」とは?
forEachは、配列の要素を繰り返し処理する時に効率よく実行できるメソッドになります。
一般的にはfor文を使うことが多いと思いますが、forEachだと繰り返し回数などをいちいち設定することなくコールバック関数でスムーズに処理できるので便利です。
ただしfor文とは異なる点などもあり、注意点もいくつかあるので本記事で詳しく学習していきましょう!
「forEach」の使い方
この章では、forEachの基本的な使い方について見ていきましょう!
主に、forEachの構文、繰り返し処理について学んでいきます。
forEachの基本的な構文
まずは、forEachの構文から見ていきましょう!
基本的には対象の配列にforEachを実行していき、処理の中身についてはコールバック関数に記述していきます。
var array = [配列データ]; array.forEach( コールバック関数 )
このような記述を行うことで、配列要素の1つずつに対してコールバック関数内の処理を実行することが可能です。
for文よりも簡潔な記述で効率よく繰り返し処理ができるのが分かりますね。
forEachで配列要素を処理する
それでは、実際にforEachを使って配列要素の繰り返し処理を実行してみましょう!
例えば、いくつかの文字列が格納された配列を処理するには次のように記述します
var items = [ 'バナナ', 'リンゴ', 'メロン', 'ブドウ' ]; items.forEach(function( value ) { console.log( value ); });
実行結果
バナナ リンゴ メロン ブドウ
この例では、forEachのコールバック関数内で引数の「value」を出力しています。
この引数「value」には配列要素の1つずつの値が順番に格納されていくので、console.logを利用することで各要素が出力されるわけです。
繰り返し回数などを設定していませんが、forEachが自動的にすべての要素を繰り返し処理してくれる点にも注目しておきましょう。
forEachで連想配列を処理する
次に、オブジェクトが格納された配列(連想配列)についても同じように繰り返し処理してみましょう。
まずは、次のような配列があるとします。
var lists = [ { name: 'バナナ', price: '100' }, { name: 'リンゴ', price: '200' }, { name: 'メロン', price: '400' }, { name: 'ブドウ', price: '250' }, ];
配列の要素にはそれぞれname / priceプロパティが格納されたオブジェクトが設定されています。
これをforEachで処理するには次のように記述します!
lists.forEach( function( value ) { console.log( value.name ); });
実行結果
バナナ リンゴ メロン ブドウ
コールバック関数内のプロパティの指定方法に注目してください。
「value.name」のように引数「value」に続けてnameプロパティを繋げることで目的の値を取得することができるのです。
break,continue,returnについて
forEachを使う上で注意することがあります。
それは、繰り返し処理の途中でbreak / continue / returnを利用することができないという点です!
例えば、次のようにforEach内でbreakを使ってみます。
var array = [1,2,3,4,5]; array.forEach(function( value ) { if( value == 3 ) break; })
この例では、配列要素の値が「3」であればbreakで処理を中断したいのですが、実際にはbreakが使えないのでエラーとなります。
そのため、あらかじめ処理を中断する必要性がある場合はforEachではなく、for文を使うなど代替方法を選ぶようにしましょう!
「async」モジュールの活用
この章では、asyncモジュールを利用した配列処理について見ていきましょう!
主に、asyncモジュールの導入から配列処理・動機処理について学んでいきます。
asyncモジュールの導入
それではasyncモジュールを使った配列処理を見ていきましょう!
まずはnpmからasyncを導入していきます。
$ npm install async
あとは、Node.jsから利用できるようにrequire()を記述しておけば準備は完了です。
const async = require('async');
以降はasyncが提供しているメソッドをNode.jsから利用できるようになります。
async.eachで配列要素を処理する
asyncモジュールで配列処理を行うには「each()」メソッドを利用するのが便利です!
async.each(配列, 関数処理)
第1引数に対象となる配列要素を指定し、第2引数に実行したい処理を記述した関数を設定するのが基本です。
次のサンプル例を見てください!
var array = ['リンゴ', 'バナナ', 'イチゴ', 'メロン']; async.each(array, function(item, callback) { console.log(item); callback(); });
この例では、文字列が格納された配列に対してasync.each()で繰り返し処理を実行しています。
関数内処理の最後にcallback()を実行することで、次章で解説する同期的なエラーハンドリングも行えるようになります。
async.eachのエラーハンドリング
async.each()にはすべての配列処理が完了したあとに、同期的に続けて処理を実行させる機能が用意されています。
これを利用することで簡単にエラーハンドリングを処理することができるわけです。
方法は簡単でeach()の第3引数に関数を設定することで実行が可能になります。
次のサンプル例を見てください。
async.each(array, function(item, callback) { console.log(item); callback(); },function(err) { if( err ) console.log('process failed'); console.log('all done'); });
async.each()の第3引数に記述した関数に注目してください!
引数に「err」を受け取っていますが、ここには何らかのエラーがあった場合に情報が格納されているので条件式に使うと便利です。
また、エラーがなくても何らかの処理を記述しておけば実行できるので、配列処理が完了したあと同期的に続けて処理を行いたい場合にも利用できるので便利です。
まとめ
今回は、Node.jsで配列処理を効率よく行えるforEachについて学習をしました!
最後に、もう一度ポイントをおさらいしておきましょう!
・forEachを利用することで効率よく配列処理を実行できる
・break / continue / returnは処理の途中で利用できない
・asyncモジュールを利用すると簡単な記述で配列処理が可能
上記内容を踏まえて、ぜひ自分でもプログラミングに取り入れて活用できるように頑張りましょう!