遅すぎたUnderscore.js入門 - 全体像

いまどこ？


**1 . 遅すぎたUnderscore.js入門 - 全体像 ←いまここ**
**2 . [遅すぎたUnderscore.js詳述 - Collections編](http://qiita.com/hp0me/items/0f6b5863984fcc1c60a4)**
**3 . [遅すぎたUnderscore.js入門 - Arrays編](http://qiita.com/hp0me/items/ad5530ed71a3c8ea8601)**
**4 . Functions**
**5 . Objects**
**6 . Utility**
**7 . Chaining**


##Underscore.jsで何ができる？（私見）
非常にざっくり言うと、Underscore.jsは**JavaScriptの表現力を高めることができる便利関数のライブラリ**です。その先に深淵なテーマもあるようですがひとまずは考えないでおきます。
たとえば配列を一つ飛びに足していったり、シャッフルしたり、従来では**アルゴリズムを組まなきゃいけないかったものが最初から提供されているという感じ**。あとは**高階関数**（これは個人的にまだ真髄を分かっていないと思います。ぶっちゃけ勉強中です・・）。さらに配列操作、便利系関数、メソッドチェーンなどが提供されています。

まとめると、**まどろっこしいアルゴリズムの実装を超えたメタ的なものに専念する**方向性だと感じます。

##一行で言うと・・・
言い方を変えましょう。こう言い換えれば経験者であればピンとくるかもしれません。あえて雑に一行で言えば、Underscore.jsとは、
「**jQueryみたいなライブラリ**」です。

##Underscore + Backboneの潮流
Underscore.jsとBackbone.js（Angular.js）で関数型プログラミング的なWebプログラミングがこれからスタンダードになっていく感じで各所で煽られています。
ですがその**ポテンシャルの割にまだ定番化していない感**があります。
乗りましょう、このビッグウェーブに ←

##大手スマホゲームで採用
意外（？）なところですが、FFRK（ファイナルファンタジーレコードキーパー）も**Underscore+Backbone & Cocos2d-xのハイブリッド**で作られていると勉強会で語られていました。個人的にはこの事実は大きいです。
今後のスマホネイティブ実装でもUnderscore.jsが取り上げられることは多いと推測します。

##いつUnderscore.jsを使うか？
基本的にどんなものとも相性が良いサブ的なライブラリなので、いつでも使用機会があります。
普通のWebページだとしても、**jQueryみたいにとりあえずrequireして使ってみる感じで良いのではないでしょうか。**なのでいつやるの？というと今ということになります。
中〜大規模なシングルページアプリケーションとかだとばっちりっぽいですが、ブラウザゲーム、ペラページなどでも積極的に使っていきたいですね。
注目すべきは実装が**アルゴリズミックになればなるほど効力を発揮する**ということでしょう。

##まずは、いっちゃいましょう
まずはドットインストールをさらっと見ましょう。
http://dotinstall.com/lessons/basic_underscorejs

##本家サイトの章立てをざっと見る
本家サイト（[http://underscorejs.org/](http://underscorejs.org/)）には主要機能が出ています。章に注目してみていきます。

###・Collections
each、mapなどjQueryでもあるような**アルゴリズム系、ループ系、シャッフル系などのコア機能**といったところでしょうか。乱暴に言うと、for文を関数で実行したりできます。


_.eachのこのコードは味気ないきがしますが、

```js:each.js

//各々の番号を順番にアラートする
_.each([1, 2, 3], alert);

```


_.whereではSQLのようにオブジェクトの探索ができます。

```js:where.js
var human_1 = {name:"Christ",religion:"Christianity",birth:1};
var human_2 = {name:"Buddha",religion:"Buddhism",birth:-563};
var human_3 = {name:"Bill Gates",religion:"Christianity",birth:1955};
var human_4 = {name:"Steve Jobs",religion:"Buddhism",birth:1955};
var humansArr = [human_1,human_2,human_3,human_4];

var results = _.where(humansArr, {religion: "Buddhism"});
console.log(results);
//[human_2,human_4]というように該当オブジェクトが配列で返ってきます。

var results_2 = _.where(humansArr, {birth: 1955, religion:"Christianity"});
console.log(results_2); // Bill Gatesのオブジェクト
```


_.groupByでは、共通項をくくりだしてグループを作れます。

```js:groupby.js
var result =  _.groupBy([1.3, 2.1, 2.4], function(num){
 return Math.floor(num);
});
console.log(result); // {1: [1.3], 2: [2.1, 2.4]}

var result_2 = _.groupBy(['one', 'two', 'three'], 'length');
console.log(result_2); // {3: ["one", "two"], 5: ["three"]}
```

###・Arrays
配列操作系の関数ですね。
配列ソート、配列比較、配列切り抜きなど。

```js:last.js

//配列から最後の値（1）を抜き出す
_.last([5, 4, 3, 2, 1]); // 1

```

###・Functions
ここでいう「Functions」とは通常の便利系関数ではなく、**高階関数（関数を引数に取る関数）を指す**ようです。
高階関数、慣れが必要ですね。


```bind.js

// bind（ = 結びつける）→ 関数を結びつける（高階関数）
var func = function(greeting){ return greeting + ': ' + this.name };
func = _.bind(func, {name: 'moe'}, 'hi');
func(); // hi: moe

```

###・Objects
JSにおけるオブジェクト、厳密な定義は置いといて、**{ }で囲われるようなものです**。

```js:values.js

//jsonからバリュー（値）を抽出して配列にする
_.values({one: 1, two: 2, three: 3}); // [1, 2, 3]

```

###・Utility
便利系ということで、ランダム関数など雑多にいろいろあります。

```js:random.js

//0から100の幅でランダムに
_.random(0, 100); // 42

```

###・Chaining
関数をドットでつないで連続的に処理できる**メソッドチェーンを扱っている**ようです。jQueryを触った方ならおなじみですが、そうでなければこれを機に。

```js:chaining.js

//1-5を三回シャッフルする
_([1,2,3,4,5]).shuffle().shuffle().shuffle();

```



##参考文献
入門としては以下の２つでこと足りると思います。（ボリューム的に）
Underscore.js入門 （ドットインストール）
http://dotinstall.com/lessons/basic_underscorejs

本家公式
http://underscorejs.org