便利機能満載のライブラリ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
times

_.times(n, iterator)

与えられたiteratorn回繰り返す

_(3).times(function(){ genie.grantWish(); });
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]

ふー、落ち着いた。久しぶりにブログ書いた。