サイトトップ

Director Flash 書籍 業務内容 プロフィール

HTML5テクニカルノート

CreateJSの配列エレメントからインデックスを得るユーティリティ関数 − indexOf()

ID: FN1310004 Technique: HTML5 and JavaScript Library: EaselJS 0.7.0 / SoundJS 0.5.0 / PreloadJS 0.4.0

indexOf()関数
文法 indexOf(array, searchElement)
概要

配列の中のエレメントを探してそのインデックスを返す。同じエレメントが複数あるときは、若い番号のインデックス。エレメントがない場合には、-1が返される。

引数

array − 配列エレメントを探すArrayオブジェクト。

searchElement − Arrayオブジェクトから探す配列エレメント。

戻り値 昇順に探して初めに見つかったエレメントのインデックスを示す整数。エレメントがなければ-1。

説明

indexOf()はCreateJSにグローバルに定められた関数で、オブジェクトもクラスも参照せず、名前空間(createjs)に続けて直接呼出します。TweenJSを除く3つのライブラリに、JavaScript(JS)ファイルIndexOf.jsとして加えられています。それぞれのコンパクト(min)版JSファイルにも含まれます。

indexOf()関数は、第1引数に渡された配列から第2引数のエレメントを探し、そのインデックスの整数を返します。エレメントが複数あるときは若い番号のインデックス、見つからないときは-1が戻り値となります。同じ結果が得られるArray.indexOf()メソッドがJavaScript 1.6からの実装になるため[*1]、ユーティリティ関数として定められたと考えられます。

[*1] Array.indexOf()メソッドの実装には汎用的な処理が加えられているため遅いという問題もあるようです(iPhoneアプリ開発メモ「[JavaScript] Array.indexOf()メソッドは遅い」参照)。


つぎのJavaScriptコードは、indexOf()関数で配列(_array)からエレメント(element)を探し、初めに見つけたインデックス(index)を取出したうえで、警告ダイアログボックスに示します(図001)。

  1. var _array = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3];
  2. var element = 5;
  3. var index = createjs.indexOf(_array, element);
  4. alert(index);

図001■初めに見つけた配列エレメントのインデックスが警告ダイアログボックスに示される
図001

indexOf()関数は、Container.removeChild()メソッドの実装にも用いられています。Container.removeChild()は、つぎのように内部的にContainer.removeChildAt()メソッドを呼出します。そのため、表示リストの配列(children)からindexOf()関数で引数の子インスタンスのインデックスを得ています(第3行目)。

  1. var p = Container.prototype = new createjs.DisplayObject();
  1. p.removeChild = function(child) {
  1.   return this.removeChildAt(createjs.indexOf(this.children, child));
  2. };

実装

indexOf()関数の実装は、つぎのように素直なのでわかりやすいでしょう。第1引数の配列のエレメントをforループで初めのインデックスから順に取出し、第2引数のエレメントと等しいかどうか評価します(第2〜3行目)。等しければループを終えてそのインデックスを戻り値とします(第4行目)。エレメントが見つからずにループが済んだときは-1を返します(第7行目)。

  1. createjs.indexOf = function (array, searchElement){
  2.   for (var i = 0, l = array.length; i < l; i++) {
  3.     if (searchElement === array[i]) {
  4.       return i;
  5.     }
  6.   }
  7.   return -1;
  8. }

ひとつつけ加えると、エレメントが等しいかどうかは厳密な等価演算子===で比べています。したがって、データの型も含めて等しくなければなりません。



作成者: 野中文雄
作成日: 2013年10月26日


Copyright © 2001-2013 Fumio Nonaka.  All rights reserved.