便利機能満載のライブラリUnderscore.js
便利機能満載のライブラリUnderscore.js - にのせき日記が「力尽きた」と仰っているので勝手に続きを書く
Object Functions
tap
_.tap(object, interceptor)
chainを使うときに、途中にobjectを割り込ませ、chainの途中結果を知ることが第一義の目的。
_([1,2,3,200]).chain(). select(function(num) { return num % 2 == 0; }). tap(console.log). map(function(num) { return num * num }). value(); => [2, 200] => [4, 40000]
isEqual
_.isEqual(object, other)
2つのobjectをdeep compareすることが目的
var moe = {name : 'moe', luckyNumbers : [13, 27, 34]}; var clone = {name : 'moe', luckyNumbers : [13, 27, 34]}; moe == clone; => false _.isEqual(moe, clone); => true
これ以降、
_.isXX(object)
は、objectがXXか否かの真偽値を返す
isEmpty
isElement
isArray
isArguments
isFunction
isString
isNumber
isBoolean
isDate
isRegExp
isNaN
isNull
isUndefined
Utility Functions
noConflict
_.noConflict()
"_"変数の制御を元に戻す。
var underscore = _.noConflict();
identity
_.identity(value)
valueと同じ値を返す。数学的には f(x) = x。意味が無いようにみえるが、underscore.jsではデフォルトのiteratorとして使われている。
var moe = {name : 'moe'}; moe === _.identity(moe); => true
mixin
_.mixin(object)
自前のutility functionsでUnderscoreを拡張できる。{name: function}のhashで追加する。
_.mixin({ capitalize : function(string) { return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase(); } }); _("fabio").capitalize(); => "Fabio"
uniqueId
_.uniqueId([prefix])
一意が要求されるclient-sideモデルまたはDOM要素に対してglobalにユニークなIDを生成する。prefixが渡せる。
_.uniqueId('contact_'); => 'contact_104'
template
_.template(templateString, [context])
JavaScript templateをレンダラとして評価される関数にコンパイルする。JSONデータからHTMLなどに変換するときに有用。Template関数は、「<%=...%>」で変数を、「<%...%>」で実行される任意のJavaScriptコードを挿入することができる。templateStringだけを引数にして、contextを自由変数にして後から実行することもできるし、その場で実行も可能。
var compiled = _.template("hello: <%= name %>"); compiled({name : 'moe'}); => "hello: moe" var list = "<% _.each(people, function(name) { %> <li><%= name %></li> <% }); %>"; _.template(list, {people : ['moe', 'curly', 'larry']}); => "<li>moe</li><li>curly</li><li>larry</li>"
JavaScript コード内では 「<%=...%>」よりも便利なprintを使うことができます
var compiled = _.template("<% print('Hello ' + epithet); %>"); compiled({epithet: "stooge"}); => "Hello stooge."
interpolateのセッティングを変更してERBみたいにすることもできます。
_.templateSettings = { interpolate : /\{\{(.+?)\}\}/g }; var template = _.template("Hello {{ name }}!"); template({name : "Mustache"}); => "Hello Mustache!"
Chaining
chain
_(obj).chain()
chain()を実行してから、メソッドをつなぐことができる。値はvalue()で取り出す
var stooges = [{name : 'curly', age : 25}, {name : 'moe', age : 21}, {name : 'larry', age : 23}]; var youngest = _(stooges).chain() .sortBy(function(stooge){ return stooge.age; }) .map(function(stooge){ return stooge.name + ' is ' + stooge.age; }) .first() .value(); => "moe is 21"
value
_(obj).value()
wrappedされたオブジェクトの値を取り出す。
_([1, 2, 3]).value(); => [1, 2, 3]
ふー、落ち着いた。久しぶりにブログ書いた。