天天看点

codewars,js实现4kyu:Default Arguments

目录

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

解题思路

难点

继续阅读