lodashの配列/オブジェクト系関数の索引を作ってみた

[lodash](https://lodash.com/docs/) のArray/Object/Collection系の関数は非常に多く、どれがどれか混乱しがち。これらを探しやすくするために、索引として使えるように分類してみました。


※1: 渡された配列/オブジェクト自体を変更**しない**。
※2: 渡された配列/オブジェクト自体を変更**する**。


# [Array] 分割・結合 [※1]

- [**chunk**](https://lodash.com/docs/#chunk) : 指定サイズで分割 `_.chunk(array, [size=1])`
- [**concat**](https://lodash.com/docs/#concat) : 配列結合 `_.concat(array, [values])`


# [Array] 除去 [※1]

- [**compact**](https://lodash.com/docs/#compact) : false 的な値除去 `_.compact(array)`
- [**drop**](https://lodash.com/docs/#drop) : 先頭ｎ個撤去 `_.drop(array, [n=1])`
- [**dropRight**](https://lodash.com/docs/#dropRight) : 末尾ｎ個撤去 `_.dropRight(array, [n=1])`
- [**dropWhile**](https://lodash.com/docs/#dropWhile) : 先頭から評価成立してる限り撤去 `_.dropWhile(array, [predicate=_.identity])`
- [**dropRightWhile**](https://lodash.com/docs/#dropRightWhile) : 末尾から評価成立してる限り撤去 `_.dropRightWhile(array, [predicate=_.identity])`
- [**without**](https://lodash.com/docs/#without) : values に合致する値撤去 `_.without(array, [values])`

# [Array] 除去 [※2]

- [**pull**](https://lodash.com/docs/#pull) : values に合致する値撤去 `_.pull(array, [...values])`
- [**pullAt**](https://lodash.com/docs/#pullAt) : 指定の場所撤去 `_.pullAt(array, [indexes])`
- [**remove**](https://lodash.com/docs/#remove) : 合致するものを撤去 `_.remove(array, [predicate=_.identity])`


# [Array] 集合 [※1]

- [**difference**](https://lodash.com/docs/#difference) : 差集合 `_.difference(array, [values])`
- [**differenceBy**](https://lodash.com/docs/#differenceBy) : 差集合 `_.differenceBy(array, [values], [iteratee=_.identity])`
- [**differenceWith**](https://lodash.com/docs/#differenceWith) : 差集合 `_.differenceWith(array, [values], [comparator])`
- [**intersection**](https://lodash.com/docs/#intersection) : 積集合 `_.intersection([arrays])`
- [**intersectionBy**](https://lodash.com/docs/#intersectionBy) : 積集合 `_.intersectionBy([arrays], [iteratee=_.identity])`
- [**intersectionWith**](https://lodash.com/docs/#intersectionWith) : 積集合 `_.intersectionWith([arrays], [comparator])`
- [**union**](https://lodash.com/docs/#union) : 和集合 `_.union([arrays])`
- [**unionBy**](https://lodash.com/docs/#unionBy) : 和集合 `_.unionBy([arrays], [iteratee=_.identity])`
- [**unionWith**](https://lodash.com/docs/#unionWith) : 和集合 `_.unionWith([arrays], [comparator])`
- [**xor**](https://lodash.com/docs/#xor) : 排他的論理和 `_.xor([arrays])`
- [**xorBy**](https://lodash.com/docs/#xorBy) : 排他的論理和 `_.xorBy([arrays], [iteratee=_.identity])`
- [**xorWith**](https://lodash.com/docs/#xorWith) : 排他的論理和 `_.xorWith([arrays], [comparator])`

# [Array] 集合 [※2]

- [**pullAll**](https://lodash.com/docs/#pullAll) : 差集合 `_.pullAll(array, values)`
- [**pullAllBy**](https://lodash.com/docs/#pullAllBy) : 差集合 `_.pullAllBy(array, values, [iteratee=_.identity])`
- [**pullAllWith**](https://lodash.com/docs/#pullAllWith) : 差集合 `_.pullAllWith(array, values, [comparator])`


# [Array] 埋める [※2]

- [**fill**](https://lodash.com/docs/#fill) : start から end(含まない) まで value で埋める `_.fill(array, value, [start=0], [end=array.length])`


# [Array] 検索 [※1]

- [**findIndex**](https://lodash.com/docs/#findIndex) : predicate が true になる最初の index を返す `_.findIndex(array, [predicate=_.identity], [fromIndex=0])`
- [**findLastIndex**](https://lodash.com/docs/#findLastIndex) : 上記の逆順 `_.findLastIndex(array, [predicate=_.identity], [fromIndex=array.length-1])`
- [**indexOf**](https://lodash.com/docs/#indexOf) : 指定の値が存在する最初の最初の index を返す `_.indexOf(array, value, [fromIndex=0])`
- [**lastIndexOf**](https://lodash.com/docs/#lastIndexOf) : 上記の逆順 `_.lastIndexOf(array, value, [fromIndex=array.length-1])`

# [Object] 検索 [※1]

- [**findKey**](https://lodash.com/docs/#findKey) : find だが返すのはキー `_.findKey(object, [predicate=_.identity])`
- [**findLastKey**](https://lodash.com/docs/#findLastKey) : 上記の逆順 `_.findLastKey(object, [predicate=_.identity])`

# [Array] ソートされてる前提での高速検索 [※1]

- [**sortedIndex**](https://lodash.com/docs/#sortedIndex) : insert されることになる index を返す `_.sortedIndex(array, value)`
- [**sortedIndexBy**](https://lodash.com/docs/#sortedIndexBy) : insert されることになる index を返す `_.sortedIndexBy(array, value, [iteratee=_.identity])`
- [**sortedLastIndex**](https://lodash.com/docs/#sortedLastIndex) : 上記の逆順 `_.sortedLastIndex(array, value)`
- [**sortedLastIndexBy**](https://lodash.com/docs/#sortedLastIndexBy) : 上記の逆順 `_.sortedLastIndexBy(array, value, [iteratee=_.identity])`
- [**sortedIndexOf**](https://lodash.com/docs/#sortedIndexOf) : indexOf `_.sortedIndexOf(array, value)`
- [**sortedLastIndexOf**](https://lodash.com/docs/#sortedLastIndexOf) : 上記の逆順 `_.sortedLastIndexOf(array, value)`

# [Array] 平たん化 [※1]

- [**flatten**](https://lodash.com/docs/#flatten) : １段階平たん化 `_.flatten(array)`
- [**flattenDeep**](https://lodash.com/docs/#flattenDeep) : 再帰的に完全に平たん化 `_.flattenDeep(array)`
- [**flattenDepth**](https://lodash.com/docs/#flattenDepth) : 指定段階で平たん化 `_.flattenDepth(array, [depth=1])`


# [Array/Object] ペア/Zip [※1]

- [**fromPairs**](https://lodash.com/docs/#fromPairs) : `[['a', 1], ['b', 2]]` → `{ 'a': 1, 'b': 2 }` `_.fromPairs(pairs)`
- [**zipObject**](https://lodash.com/docs/#zipObject) : `['a', 1], ['b', 2]` → `{ 'a': 1, 'b': 2 }` `_.zipObject([props=[]], [values=[]])`
- [**toPairs**](https://lodash.com/docs/#toPairs) : `{ 'a': 1, 'b': 2 }` → `[['a', 1], ['b', 2]]` `_.toPairs(object)`
- [**toPairsIn**](https://lodash.com/docs/#toPairsIn) : toPairs ただし、親も見る `_.toPairsIn(object)`
- [**zipObjectDeep**](https://lodash.com/docs/#zipObjectDeep) : プロパティパスを使える。`['a.b[0].c', 'a.b[1].d'], [1, 2]` `_.zipObjectDeep([props=[]], [values=[]])`
- [**unzip**](https://lodash.com/docs/#unzip) : `[['a', 1, true], ['b', 2, false]]` → `[['a', 'b'], [1, 2], [true, false]]` `_.unzip(array)`
- [**unzipWith**](https://lodash.com/docs/#unzipWith) : 上記のwith版 `_.unzipWith(array, [iteratee=_.identity])`
- [**zip**](https://lodash.com/docs/#zip) : `['a', 'b'], [1, 2], [true, false]` → `[['a', 1, true], ['b', 2, false]]` `_.zip([arrays])`
- [**zipWith**](https://lodash.com/docs/#zipWith) : 上記のwith版 `_.zipWith([arrays], [iteratee=_.identity])`


# [Array] 取り出す [※1]

- [**head**](https://lodash.com/docs/#head) : 最初の１個 `_.head(array)`
- [**last**](https://lodash.com/docs/#last) : 最後の１個 `_.last(array)`
- [**take**](https://lodash.com/docs/#take) : 最初からｎ個 `_.take(array, [n=1])`
- [**takeRight**](https://lodash.com/docs/#takeRight) : 最後からｎ個 `_.takeRight(array, [n=1])`
- [**takeWhile**](https://lodash.com/docs/#takeWhile) : 最初から一致する限り返す `_.takeWhile(array, [predicate=_.identity])`
- [**takeRightWhile**](https://lodash.com/docs/#takeRightWhile) : 最後から一致する限り返す `_.takeRightWhile(array, [predicate=_.identity])`
- [**initial**](https://lodash.com/docs/#initial) : 末尾以外を返す `_.initial(array)`
- [**tail**](https://lodash.com/docs/#tail) : 先頭以外を返す `_.tail(array)`
- [**nth**](https://lodash.com/docs/#nth) : 指定番目の値。マイナスも使える `_.nth(array, [n=0])`


# [Array] ユニーク [※1]

- [**uniq**](https://lodash.com/docs/#uniq) : 重複なくす `_.uniq(array)`
- [**uniqBy**](https://lodash.com/docs/#uniqBy) : 上記のby版 `_.uniqBy(array, [iteratee=_.identity])`
- [**uniqWith**](https://lodash.com/docs/#uniqWith) : 上記のwith版 `_.uniqWith(array, [comparator])`
- [**sortedUniq**](https://lodash.com/docs/#sortedUniq) : ソートされている配列に最適化された `uniq` `_.sortedUniq(array)`
- [**sortedUniqBy**](https://lodash.com/docs/#sortedUniqBy) : 上記のby版 `_.sortedUniqBy(array, [iteratee])`


# [Collection] グルーピング [※1]

- [**countBy**](https://lodash.com/docs/#countBy) : グループごとカウント `_.countBy(collection, [iteratee=_.identity])`
- [**groupBy**](https://lodash.com/docs/#groupBy) : グルーピング `_.groupBy(collection, [iteratee=_.identity])`
- [**keyBy**](https://lodash.com/docs/#keyBy) : グルーピング。キーを計算で出す。キーが重複したらどれか１個 `_.keyBy(collection, [iteratee=_.identity])`


# [Collection] 判定

- [**every**](https://lodash.com/docs/#every) : すべてにマッチするか `_.every(collection, [predicate=_.identity])`
- [**includes**](https://lodash.com/docs/#includes) : 値として含まれてるか `_.includes(collection, value, [fromIndex=0])`
- [**some**](https://lodash.com/docs/#some) : いずれかにマッチするか `_.some(collection, [predicate=_.identity])`


# [Collection] 絞り込み [※1]

- [**filter**](https://lodash.com/docs/#filter) : 通常の filter に加え、shorthand 使える `_.filter(collection, [predicate=_.identity])`
- [**find**](https://lodash.com/docs/#find) : 最初の１件 `_.find(collection, [predicate=_.identity], [fromIndex=0])`
- [**findLast**](https://lodash.com/docs/#findLast) : 最後の１件 `_.findLast(collection, [predicate=_.identity], [fromIndex=collection.length-1])`
- [**reject**](https://lodash.com/docs/#reject) : filter の逆 `_.reject(collection, [predicate=_.identity])`


# [Collection] ループ [※1]

- [**forEach**](https://lodash.com/docs/#forEach) : オブジェクトでも使える。length があると配列としてループする。return false で break `_.forEach(collection, [iteratee=_.identity])`
- [**forEachRight**](https://lodash.com/docs/#forEachRight) : 上記の逆順 `_.forEachRight(collection, [iteratee=_.identity])`

# [Object] オブジェクト専用ループ [※1]

- [**forIn**](https://lodash.com/docs/#forIn) : オブジェクト専用 forEach 。length の影響受けない。親クラスのプロパティも対象 `_.forIn(object, [iteratee=_.identity])`
- [**forInRight**](https://lodash.com/docs/#forInRight) : 上記の逆順 `_.forInRight(object, [iteratee=_.identity])`
- [**forOwn**](https://lodash.com/docs/#forOwn) : オブジェクト専用 forEach 。length の影響受けない。親クラスのプロパティは対象外 `_.forOwn(object, [iteratee=_.identity])`
- [**forOwnRight**](https://lodash.com/docs/#forOwnRight) : 上記の逆順 `_.forOwnRight(object, [iteratee=_.identity])`


# [Collection] 各要素Map [※1]

- [**map**](https://lodash.com/docs/#map) : map。オブジェクトでも使える `_.map(collection, [iteratee=_.identity])`
- [**invokeMap**](https://lodash.com/docs/#invokeMap) : map。ただし引数与えられる `_.invokeMap(collection, path, [args])`
- [**flatMap**](https://lodash.com/docs/#flatMap) : map だが戻り値は flat になる(0～複数個を配列で返せる) `_.flatMap(collection, [iteratee=_.identity])`
- [**flatMapDeep**](https://lodash.com/docs/#flatMapDeep) : map だが戻り値は flat になる(0～複数個を配列で返せる) `_.flatMapDeep(collection, [iteratee=_.identity])`
- [**flatMapDepth**](https://lodash.com/docs/#flatMapDepth) : map だが戻り値は flat になる(0～複数個を配列で返せる) `_.flatMapDepth(collection, [iteratee=_.identity], [depth=1])`

# [Object] 各要素Map [※1]

- [**mapKeys**](https://lodash.com/docs/#mapKeys) : キー名を差し替えた object を生成するための map `_.mapKeys(object, [iteratee=_.identity])`
- [**mapValues**](https://lodash.com/docs/#mapValues) : 値を差し替えた object を生成するための map `_.mapValues(object, [iteratee=_.identity])`

# [Collection] ソート [※1]

- [**sortBy**](https://lodash.com/docs/#sortBy) : ソート `_.sortBy(collection, [iteratees=[_.identity]])`
- [**orderBy**](https://lodash.com/docs/#orderBy) : sortBy。ただし asc/desc を指定できる `_.orderBy(collection, [iteratees=[_.identity]], [orders])`
- [**shuffle**](https://lodash.com/docs/#shuffle) : シャッフル `_.shuffle(collection)`


# [Collection] 分割 [※1]

- [**partition**](https://lodash.com/docs/#partition) : 処理結果で２つに分割 `_.partition(collection, [predicate=_.identity])`


# [Collection] reduce [※1]

- [**reduce**](https://lodash.com/docs/#reduce) : iteratee の第１引数で前の値を受け取り、新しい値を返す。accumulator は整数でもなんでもいい。 `_.reduce(collection, [iteratee=_.identity], [accumulator])`
- [**reduceRight**](https://lodash.com/docs/#reduceRight) : 上記の逆順 `_.reduceRight(collection, [iteratee=_.identity], [accumulator])`
- [**transform**](https://lodash.com/docs/#transform) : 基本 reduce。ただし、iteratee の第１引数で accumulator を受け取り、直接変更する。accumulator は配列か object 。ループを中断したいなら false を返す。 `_.transform(object, [iteratee=_.identity], [accumulator])`


# [Collection] サンプリング [※1]

- [**sample**](https://lodash.com/docs/#sample) : １件ランダム抽出 `_.sample(collection)`
- [**sampleSize**](https://lodash.com/docs/#sampleSize) : ｎ件ランダム抽出 `_.sampleSize(collection, [n=1])`


# [Object] マージ [※2]

- [**assign**](https://lodash.com/docs/#assign) : Object.assign と同様。親クラスのプロパティは見ない。 `_.assign(object, [sources])`
- [**assignWith**](https://lodash.com/docs/#assignWith) : 上記のwith版 `_.assignWith(object, sources, [customizer])`
- [**assignIn**](https://lodash.com/docs/#assignIn) : Object.assign と同様。親クラスのプロパティを見る。 `_.assignIn(object, [sources])`
- [**assignInWith**](https://lodash.com/docs/#assignInWith) : 上記のwith版 `_.assignInWith(object, sources, [customizer])`
- [**defaults**](https://lodash.com/docs/#defaults) : Object.assign っぽいが、先勝ち `_.defaults(object, [sources])`
- [**defaultsDeep**](https://lodash.com/docs/#defaultsDeep) : 上記のDeep版 `_.defaultsDeep(object, [sources])`
- [**merge**](https://lodash.com/docs/#merge) : _.assign と同様。ただしDeep。 `_.merge(object, [sources])`
- [**mergeWith**](https://lodash.com/docs/#mergeWith) : 上記のwith版 `_.mergeWith(object, sources, customizer)`


# [Object] Path [※1]

- [**get**](https://lodash.com/docs/#get) : 値取得。なくてもエラーにならない。デフォルト値を返すようにもできる。 `_.get(object, path, [defaultValue])`
- [**result**](https://lodash.com/docs/#result) : _.get 。ただし、値が関数なら実行結果を返す `_.result(object, path, [defaultValue])`
- [**at**](https://lodash.com/docs/#at) : Pathでの取得結果を配列で `_.at(object, [paths])`
- [**has**](https://lodash.com/docs/#has) : path が存在するか `_.has(object, path)`
- [**hasIn**](https://lodash.com/docs/#hasIn) : path が存在するか。親も見る `_.hasIn(object, path)`
- [**invoke**](https://lodash.com/docs/#invoke) : path の値を関数として実行 `_.invoke(object, path, [args])`
- [**omit**](https://lodash.com/docs/#omit) : 無視する path を指定。親も見る `_.omit(object, [paths])`
- [**omitBy**](https://lodash.com/docs/#omitBy) : 上記のby版 `_.omitBy(object, [predicate=_.identity])`
- [**pick**](https://lodash.com/docs/#pick) : 活かすプロパティ(path)を指定 `_.pick(object, [paths])`
- [**pickBy**](https://lodash.com/docs/#pickBy) : 上記のby版 `_.pickBy(object, [predicate=_.identity])`

# [Object] Path [※2]

- [**set**](https://lodash.com/docs/#set) : path に値セット。中間のobjectやarrayがなければ作られる。 `_.set(object, path, value)`
- [**setWith**](https://lodash.com/docs/#setWith) : 上記のwith版 `_.setWith(object, path, value, [customizer])`
- [**unset**](https://lodash.com/docs/#unset) : path のキー削除 `_.unset(object, path)`
- [**update**](https://lodash.com/docs/#update) : path の値を updater の結果に更新 `_.update(object, path, updater)`
- [**updateWith**](https://lodash.com/docs/#updateWith) : 上記のwith版 `_.updateWith(object, path, updater, [customizer])`


# [Object] キー/値抽出 [※1]

- [**keys**](https://lodash.com/docs/#keys) : キーを得る `_.keys(object)`
- [**keysIn**](https://lodash.com/docs/#keysIn) : キーを得る。親も見る `_.keysIn(object)`
- [**functions**](https://lodash.com/docs/#functions) : 関数名の配列を返す。親クラスは見ない `_.functions(object)`
- [**functionsIn**](https://lodash.com/docs/#functionsIn) : 関数名の配列を返す。親クラスも見る `_.functionsIn(object)`
- [**values**](https://lodash.com/docs/#values) : 値を得る `_.values(object)`
- [**valuesIn**](https://lodash.com/docs/#valuesIn) : 値を得る。親も見る `_.valuesIn(object)`


# [Object] 倒置 [※1]

- [**invert**](https://lodash.com/docs/#invert) : キー、値の入れ替え `_.invert(object)`
- [**invertBy**](https://lodash.com/docs/#invertBy) : 上記のby版 `_.invertBy(object, [iteratee=_.identity])`

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)
- [lodash でよく使う王道関数](https://qiita.com/waterada/items/986660d31bc107dbd91c)