lodash ちょっとマニアックだけど便利な関数

JavaScript を使っているなら [lodash](https://lodash.com/docs/) は大変便利なのですが、関数が多すぎてどれ使ったらいいのか解りづらいのが難点です。

ここではその中からマニアックだけど便利な関数を紹介します。

Math 系
=========

小数点を指定しての引き上げ/切り捨て/四捨五入
-----------------------------------------

[ceil](https://lodash.com/docs/4.17.10#ceil), [floor](https://lodash.com/docs/4.17.10#floor), [round](https://lodash.com/docs/4.17.10#round)

```js
_.ceil(number, 2) // 小数点第2位で切り上げ
_.floor(number, 2)
_.round(number, 2)
```
- 標準の `Math` の関数では小数点第ｎ位の指定ができなかった。

配列を渡しての集計
-----------------------------------------

[max](https://lodash.com/docs/4.17.10#max), [min](https://lodash.com/docs/4.17.10#min), [sum](https://lodash.com/docs/4.17.10#sum), [mean](https://lodash.com/docs/4.17.10#mean)

```js
_.max([1, 2, 3])  // -> 3
_.min([1, 2, 3])  // -> 1
_.sum([1, 2, 3])  // -> 6
_.mean([1, 2, 3]) // -> 2
```
- `Math` の関数では引数に展開して渡す必要があった。

オブジェクトのプロパティで集計
-----------------------------------------

[maxBy](https://lodash.com/docs/4.17.10#maxBy), [minBy](https://lodash.com/docs/4.17.10#minBy), [sumBy](https://lodash.com/docs/4.17.10#sumBy), [meanBy](https://lodash.com/docs/4.17.10#meanBy)

```js
_.maxBy([{a:1}, {a:2}, {a:3}], 'a')   // -> {a:3}
_.minBy([{a:1}, {a:2}, {a:3}], 'a')   // -> {a:1}
_.sumBy([{a:1}, {a:2}, {a:3}], 'a')   // -> 6
_.meanBy([{{a:1}, {a:2}, {a:3}], 'a') // -> 2
```
- `'a'` の代わりに `o => o.a` のように関数を渡すことも可。

Number 系
===========

数値を強制的に範囲にとどめる
-----------------------------------------

[clamp](https://lodash.com/docs/4.17.10#clamp)

```js
_.clamp(-10, -5, 5) // => -5
_.clamp(10, -5, 5) // => 5
```

ランダム値を得る
-----------------------------------------

[random](https://lodash.com/docs/4.17.10#random)

```js
_.random(0, 5)        // => 0～5 の整数値
_.random(0, 5, true)  // => 0～5 の浮動小数
_.random(1.2, 5.2)    // => 1.2～5.2 の浮動小数
```

String 系
===========

変則的な大文字/小文字
-----------------------------------------

[camelCase](https://lodash.com/docs/4.17.10#camelCase), [kebabCase](https://lodash.com/docs/4.17.10#kebabCase), [snakeCase](https://lodash.com/docs/4.17.10#snakeCase), [capitalize](https://lodash.com/docs/4.17.10#capitalize)

```js
_.camelCase('Foo Bar')     // => 'fooBar'
_.camelCase('foo-bar')     // => 'fooBar'
_.camelCase('__FOO_BAR__') // => 'fooBar'

_.kebabCase('Foo Bar')     // => 'foo-bar'
_.kebabCase('fooBar')      // => 'foo-bar'
_.kebabCase('__FOO_BAR__') // => 'foo-bar'

_.snakeCase('Foo Bar')     // => 'foo_bar'
_.snakeCase('fooBar')      // => 'foo_bar'
_.snakeCase('--FOO-BAR--') // => 'foo_bar'

_.capitalize('FRED')       // => 'Fred'
```

パディング
-----------------------------------------

[pad](https://lodash.com/docs/4.17.10#pad), [padStart](https://lodash.com/docs/4.17.10#padStart), [padEnd](https://lodash.com/docs/4.17.10#padEnd)

```js
_.pad('abc', 8, ' ')      // => '  abc   ' // 前後に埋める
_.padStart('abc', 8, ' ') // => '     abc' // 前に埋める
_.padEnd('abc', 8, ' ')   // => 'abc     ' // 後に埋める
```

エスケープ
-----------------------------------------

[escape](https://lodash.com/docs/4.17.10#escape), [unescape](https://lodash.com/docs/4.17.10#unescape), [escapeRegExp](https://lodash.com/docs/4.17.10#escapeRegExp)

```js
_.escape('fred, barney, & pebbles')
// => 'fred, barney, &amp; pebbles'

_.unescape('fred, barney, &amp; pebbles');
// => 'fred, barney, & pebbles'

_.escapeRegExp('[lodash](https://lodash.com/)')
// => '\[lodash\]\(https://lodash\.com/\)'
```

Util 系
===========

ユニーク番号生成
-----------------------------------------

[uniqueId](https://lodash.com/docs/4.17.10#uniqueId)

```js
_.uniqueId('contact_') // => 'contact_104'
_.uniqueId() // => '105'
```

Lang 系
===========

どんなものも配列としてうけとる
-----------------------------------------

[castArray](https://lodash.com/docs/4.17.10#castArray)

```js
_.castArray([0, 1]) // -> [0, 1]  // 配列ならそのまま
_.castArray(0)      // -> [0]
_.castArray(null)   // -> [null]
```

- 戻り値が１個のときのみ配列じゃなくなっちゃう API を使ってるときになどに便利。

クローン
-----------------------------------------

[clone](https://lodash.com/docs/4.17.10#clone), [cloneDeep](https://lodash.com/docs/4.17.10#cloneDeep)

```js
var cloned = _.clone(value) // 浅いクローン
var cloned = _.cloneDeep(value)
```


lodash関連の記事
======

- [lodash の path を使う関数でオブジェクト操作が便利になる](https://qiita.com/waterada/items/8c57f37d3decdbc583fe)
- [lodash の forEach/map/reduce 系の関数を紹介](https://qiita.com/waterada/items/22ef4c618050ea766137)
- [lodash ちょっとマニアックだけど便利な関数](https://qiita.com/waterada/items/63eb186e2150d38bb6ed)
- [lodash の debounce や throttle で簡単に負荷対策](https://qiita.com/waterada/items/986660d31bc107dbd91c)