目錄
-
- 題目簡介
- Example
- 最終代碼
- 解題思路
- 難點
題目簡介
該kata的連結位址
Write a function defaultArguments. It takes a function as an argument, along with an object containing default values for that function’s arguments, and returns another function which defaults to the right values.
You cannot assume that the function’s arguments have any particular names.
You should be able to call defaultArguments repeatedly to change the defaults.
function add(a,b) { return a+b;};
var add_ = defaultArguments(add,{b:9});
add_(10); // returns 19
add_(10,7); // returns 17
add_(); // returns NaN
add_ = defaultArguments(add_,{b:3, a:2});
add_(10); // returns 13 now
add_(); // returns 5
add_ = defaultArguments(add_,{c:3}); // doesn't do anything, since c isn't an argument
add_(10); // returns NaN
add_(10,10); // returns 20
HINT: This problem requires using
Fuction.prototype.toString()
in order to extract a function’s argument list
Example
function add(a,b) { return a+b; }
var add_ = defaultArguments(add,{b:9});
Test.assertEquals(add_(10), 19);
Test.assertEquals(add_(10,5), 15);
var add_ = defaultArguments(add_,{b:3});
Test.assertEquals(add_(10), 13);
function add(_id) { return _id; }
Test.assertEquals(defaultArguments(add,{_id:'test'})(unbdefined), undefined);
function add(a,//this
b /*this this this*/) { return a+b; }
Test.assertEquals(defaultArguments(add,{b:1})(5), 6);
最終代碼
function defaultArguments(func, params) {
// TODO: Program me
var args = func.toString().replace(/\/\/.*/gm, '')
.replace(/\/\*.*?\*\//g, '')
.replace(/\s+/g, '').match(/\(.*?\)/).join('').replace(/[\(\)]/gi,'').split(',');
function sum(...num){
num = num.map(x=> {return x==undefined ? 'un' : x} );
for (i in params) {
args.indexOf(i)!=-1 && (num[args.indexOf(i)] == undefined) && (num[args.indexOf(i)] = params[i])
}
num = num.map(x=>{return x=='un' ? undefined : x})
sum.toString = function(){
return func.toString()
}
return num.length != args.length ? NaN : func(...num)
};
return sum;
}