天天看點

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;
}
           

解題思路

難點

繼續閱讀