目录
-
- 题目简介
- 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;
}