https://bfe.dev/ja はFrontEnd版のLeetCode、GAFAの面接を受けるなら練習した方がいいかなと。
以下は自分の練習記録です。
まずサンプルコードからinput/outputを決めていきます
const join = (a, b, c) => {
return `${a}_${b}_${c}`
}
const curriedJoin = curry(join)
curriedJoin(1, 2, 3) // '1_2_3'
curriedJoin(1)(2, 3) // '1_2_3'
curriedJoin(1, 2)(3) // '1_2_3'
上から見るとcurry()
はfunctionを返し、しかも任意の数の引数を渡せることができ、function自体は以下のことをする:
- 引数足りるなら、joinを実行して結果を返す
- 引数足りなければ、新しいfunctionを返て、1を繰り返す
2番はすごく大事です。curriedJoin(1,2)
で返すfunctionは、渡される引数の前に1と2をinsertする必要。これは``Function.prototype.bind()`を使えば行ける。
function curry(func) {
return function curried(...args) {
// 1. if enough args, call func
// 2. if not enough, bind the args and wait for new one
if (args.length >= func.length) {
return func.apply(this, args)
} else {
return curried.bind(this, ...args)
}
}
}
よし, 通った!
第一問は簡単で、興味あれば一緒に https://bfe.dev で練習していきましょう。