once
-
1度しか使えない関数を返す
クロージャを使う_.once = (funk) => { let called = false; let returnFunk = undefined; return (...args) => { if(!called) { returnFunk = funk(...args); called = true; return returnFunk; } };` -
called = 1度でも呼び出ししたかを判定
-
returnFunc = 1回目の呼び出しで実行し、結果をreturnFuncに入れる
-
2回目以降は、trueなので、すでにfuncが実行された状態の値 = returnFuncを返す
memoize
-
引数として関数をとる
-
引数の関数の引数が何かを記憶し、
記憶した引数と同じ引数が来たときは、過去の関数の実行結果を返す`_.memoize = (func) => { const resultObj = {}; return (n) => { if(resultObj[n] === undefined) { resultObj[n] = func(n); } return resultObj[n]; }` -
オブジェクトで、引数とその引数を渡して実行した関数の結果を管理
-
内部の関数の引数に渡されたnをキーにした値がresultObjに存在するか確認
-
もし存在しなければnを引数にした関数の実行結果をnをキーにして値に設定
-
必ずresultObjに保存されるので、最後にはresultObj[n]を返せば良い
invoke
`_.invoke = (collection,functionOrString) => {
if(typeof functionOrString === "function") {
return _.map(collection,(val) => {
return functionOrString(val).apply(val));
}else {
return _.map(colection,(val) => {
return val[functionOrString].apply(val));
}
};`
-
"sort"のような文字列の場合に
メソッドとして呼び出すには、["sort"]のように呼び出せば良い
(javascriptオブジェクトのメソッドを呼び出す = ドット記法とブラケット記法両方呼べる) - applyはthisを指定できる
- val[sort]したときに、thisが何かわからなくなるので、val[sort].apply[val]
- でval = 配列をthisに指定する必要がある
今回、混乱したポイント
- mapとの違い
- なぜapplyする必要があるか?
mapは、自分で定義した関数を、配列の各要素に実行する
invokeは、例えばsortなどの自身配列が持っているメソッドを使うので、array.sortの様に誰がsortを呼んだのかのthisが必要になる