underscore.jsの力を借りてJSON形式のデータ並べ替えを行う
Titanium Nagoya Chatroom と同じ日に東京で行われていたAndroid Bazaar and Conference 2012 でScaling Titanium Mobileというお話をqnypの@junyaさんがされていました。
Titanium Nagoya Chatroomで喋り終えた後の帰りの新幹線で上記スライドのPDF版ダウンロードして読んでいてunderscore.jsの特徴について
- 配列や関数に対する操作を容易にする
- JavaScriptのビルトインオブジェクトを拡張しない
- 関数プログラミング由来のものを中心とした60ほどの関数
ということが書かれており最後の関数プログラミング由来・・という部分にちょっと興味惹かれました。
自分は以前にWSH+JScript+prototype.jsで業務効率化のツール(詳しくはこれ)をちょこちょこ作っていたこともあり、underscore.jsのeach、map、invoke、pluck・・というあたりはprototype.js のそれと通じるので使うのに心理的に敷居が低く感じられました。
どんな状況で使おうとしているか?
今こんなアプリを作ってます。
MongoDBのクラウドサービスのmongolabに格納してあるブログのエントリ情報を取得する際にJSONDBに元々備わっているmongolab連携機能を活用してます。
取得自体は問題なく出来ているのですが、ブログの更新日付順にソートした状態にしたいのに、それが機能せずに悩んでいたのでunderscore.jsに助けてもらおうと思って使うことにしました
underscore.js使うための準備
underscore.jsのサイトからダウンロードします
ダウンロードしたファイルを自分が作ってるプロジェクトのResources配下の任意の場所に配置します。
※自分の場合には他の方が作った便利ライブラリはlib/以下に配置するようにしているためこのような感じになります。
使い方
var _ = require('lib/underscore')._; var origin = [ { post_date:"2006/01/01 00:00:00", title:'Abb更新が止まっている', id:3 }, { post_date:"2005/12/01 12:00:01", title:'Google', id:1 }, { post_date:"2006/04/01 13:00:04", title:'Aaa-はじめまして', id:2 } ]; var data = _.chain(origin) .sortBy(function(item) {return item.post_date; }) .value(); Ti.API.info(data);
上記の例だと、post_dateをキーにして並べ替えが実行されるのでTi.API.infoの結果は以下のようになります。
[INFO] ( { id = 1; "post_date" = "2005/12/01 12:00:01"; title = Google; }, { id = 3; "post_date" = "2006/01/01 00:00:00"; title = "Abb\U66f4\U65b0\U304c\U6b62\U307e\U3063\U3066\U3044\U308b"; }, { id = 2; "post_date" = "2006/04/01 13:00:04"; title = "Aaa-\U306f\U3058\U3081\U307e\U3057\U3066"; } )
もしも、idをキーにソートしたい場合には
var data = _.chain(origin) .sortBy(function(item) {return item.id; }) .value();
とすればOKです。
並べ替えの順番を反対にしたい場合にはdata.reverse()とすれば意図した結果が得られると思います。
今後に向けて
mongolabから取得したデータはローカルにキャッシュする仕様を考えてて、そこの処理はJSONDBモジュールで簡単に実現出来ているのですが、ローカルから読み込んだJSONデータに対してちょっとフィルタをかけたい場合などに再びローカルキャッシュにクエリーを投げず、underscore.jsの力を借りて読み込む済のJSONデータに対して処理する事ができないかなとちょっと考えています。