TOPシステム開発> injectメソッド
まるごとJavaScript&Ajax!
JavaScriptを洗練させるPrototype.js

第5回:代表的なメソッドの紹介
著者:ガイアックス  天野 仁史   2007/3/7
前のページ  1  2
injectメソッド

   injectメソッドも、eachやcollectのようにそれぞれの要素に対してイテレータを実行していくメソッドです。ただし、injectメソッドでは、最後のイテレータの返した値がメソッド自体の返り値となります。そして、イテレータには前のイテレータが返した値が引数として渡されます。最初のイテレータにはinjectメソッドの第1引数が渡されます。

   言葉で説明しても少しわかりにくいと思いますので、リスト16の例を見てください。このように、配列から文字列が生成されていくのがわかります。
リスト16:injectメソッド
var array = [1, 2, 3, 4, 5];
var iterator = function(memo, e) { return memo + e };

array.inject('value: ', iterator); // 'value: 12345'という文字列が生成される

   このように、injectメソッドは配列から何かしらのオブジェクトを生成するために使われます。配列内のデータの集計などに使われることがよくあります。


invokeメソッド

   invokeメソッドは、基本的にcollectメソッドと同じことをするメソッドなのですが、処理の指定方法が違います。invokeメソッドでは配列の各要素に対して実行させたいメソッド名を渡すのです。

   例えば、リスト17を見てください。

リスト17:invokeメソッド
var array = ['JavaScript', 'Prototype.js'];
array.invoke('toUpperCase');
// ['JAVASCRIPT', 'PROTOTYPE.JS']という配列が生成される。

   この例では、配列を含むすべての要素に対してtoUpperCaseメソッドを呼び出しました。つまり、array.collect(function(e){returne.toUpperCase(); })を呼び出したのと同じ結果になります。また、invokeメソッドの第2引数以降を指定した場合は、メソッド呼び出しの引数として渡されます。


イテレータの実行制御

   ここまで、さまざまなイテレータを紹介してきました。これらのイテレータの中では、共通して$breakや$continueという特別な意味を持ったオブジェクトを使うことができます。これらのオブジェクトをthrowすることによって途中で処理を中断したり、特定の要素に対する処理を飛ばしたりできるのです。

   リスト18の例を見てください。

リスト18:$break、$continueによる実行制御
var array = [1, 2, 3, 4];

// 要素が3なら処理を中断する
var newArray1 = array.collect(function(e) { // newArray1は[1, 2]となる
   if (e == 3) throw $break;
   return e;
});

// 要素が3なら処理を飛ばす
var newArray2 = array.collect(function(e) { // newArray2は[1, 2, 4]となる
   if (e == 3) throw $continue;
   return e;
});

   最初のcollectでは、要素の値が3の場合に、それ以上の走査を中断しています。2つ目のcollectでは、要素の値が3の場合の処理を飛ばしています。このようにイテレータ内部でフロー管理を行うこともでき、より柔軟な配列の走査を実現できます。


次回は

   次回はDOMの拡張について解説していきます。

前のページ  1  2

株式会社ガイアックス 天野 仁史
著者プロフィール
株式会社ガイアックス   天野 仁史
渋谷で働くWebプログラマ。出身は石川県金沢市。21歳でプログラミングに出会い、IT戦士になることを決意。それからというもの、寝ても覚めてもプログラムを書き続け今に至る。はてなでamachangというidでブログを書いてます。

IT戦記
http://d.hatena.ne.jp/amachang/


INDEX
第5回:代表的なメソッドの紹介
  メソッドの解説
injectメソッド