読み込んだjsonファイルをjqueryでフィルタリング処理の練習

javascript

jsonファイルで、読み込んだ画像リストを表示するのは、まぁそんな難しくないけども、例えば画像のカテゴリごとに表示させるようなフィルターをかけるにはどうしたらいいんだろうってことで調べました。

jsonファイルの構造

とりあえずjsonファイルは下記のように記述しました。

まぁなんとなく分かると思いますが(笑) captionは、画像の下に表示するキャプションでurlは画像までのパスです。そんでフィルタリングするときに必要なのが、categoryです。

htmlファイルの構造

htmlファイルはとりあえず、フォームはラジオボタンにしてあり、valueの値をjsonファイルのcategoryの値と同じにします。条件分岐の際に必要になります。

そして、jsonファイルから読み込んだデータをリストで表示したいのでulタグを記述してid名など付けておきます。

javascript(jquery)の構造

javascript(jquery)の記述は下記のとおりです。少し長いの分割して書いていきます。

変数設定

$imageWrap jsonファイルを読みこんだ後に表示させるためのラッパー要素
alldata jsonファイルから読みこんだ全データを保持するための配列
filterdata フィルターをかけて抽出したデータを保存するための配列

ちなみに「$imageWrap」に関しては、jqueryオブジェクトの参照を保持するための変数です。のちのちjqueryのempty()を利用するためです。

最初に読み込んだ時に発生する関数:init()

「$.getJSON」でjsonファイルを読みこんだ後に、init()を実行させています。関数の引数のdataプロパティにはgetJSONで読みこんだjsonファイルのデータが格納されています。

alldataには全データを保存しておきます。この変数は基本的には全データを保存しておく役割だけなので、以後この値が変わることはない。

filterdataは、基本的にはラジオボタンのチェックされた状況に応じて値が変化する変数です。ただ最初に読み込まれたときは全部のデータを表示させておきたいので、alldataの値を代入しています。

その後にdisplayメソッドを実行しています。

画像表示させるための関数:display()

この関数では、jsonファイルのデータから画像のurlとキャプションである文字列を取り出して表示させるための関数です。

まず最初に、$imageWrapの子要素を全て削除し、空にするためにempty()を実行します。
ここで実行しておかないと最初に読み込んだときやフィルタリングされた時の以前のデータが残ってしまい、どんどんデータが追加されていくだけになるからです。

あとはfilterdataにあるデータの数だけfor文でぶん回して、$imageWrapにappendTo()で追加する。

ラジオボタンが変わった時にフィルタリング処理する関数:change()

この関数は、カテゴリを示すラジオボタンのチェックした値が変わった時に実行されます。その時にjsonファイルからチェックされたカテゴリのデータを抽出します。

最初にチェックされたラジオボタンのvalueの値(カテゴリーの文字列)を取得して変数cateに代入しておきます。

あたらしくデータを抽出するので一旦、filterdataにあるデータを空っぽにするために配列を初期化します。

後は、変数cateの値がallだったら、alldataの全部のデータをfilterdataに代入して、それ以外であれば、$.grep()を利用してalldataを走査してチェックされたカテゴリーの値とalldataにあるjsonファイルのcategoryの値が合っているかチェックします。その値が合っていた場合には、returnでその値がfilterdataに返り値として代入されます。

データを新たに抽出してfilterdataに代入されたらdisplay()で表示させます。