2017-05-20 25 views
0

我有这两个单独的JavaScript函数,使用数字或空格执行相同的任务。我不是那么熟悉函数,所以我的问题是如何将以下两个合并为一个?结合这些特定的JavaScript函数

function padnum(string, length) 
{ 
    while (string.length < length) { 
     string += Math.floor(Math.random() * 10); 
    } 
    return string; 
} 

function ws(string, length) 
{  
    while (string.length < length) { 
     string += " "; 
    } 
    return string; 
} 
+0

当'padnum'将被调用,并且当'ws'将被调用? – brk

+1

把它们合并成什么? – EyuelDK

+0

举例说明你想要的结果 –

回答

-1

唯一的区别是连接值。您可以创建一个函数来连接返回值。

function pad(string, length, fn) { 
 
    while (string.length < length) { 
 
    string += typeof fn === 'string' ? fn : fn(); 
 
    } 
 
    return string; 
 
} 
 

 
const padnum = (str, len) => pad(str, len,() => Math.floor(Math.random() * 10)); 
 
const ws  = (str, len) => pad(str, len, " "); 
 

 
console.log(padnum('00', 5)); 
 
console.log(ws('Hello', 8));
.as-console-wrapper { top: 0; max-height: 100% !important; }

-4

您可以将参数传递给函数返回符合条件

function padnum(string, len, type) { 
 
    while (string.length < len) { 
 
    string += type === "randomPad" ? Math.floor(Math.random() * 10) : " "; 
 
    } 
 
    return string; 
 
} 
 

 
var len = 5; 
 

 
var spaces = 2; 
 

 
var res = padnum(padnum("abc", len, "randomPad"), len + spaces); 
 

 
console.log(res, res.length);

+0

@Maase Answer的方法不再返回预期的结果吗? – guest271314

2

考虑要结合这两种功能是如何的不同价值。然后“分解”这些差异以创建通用功能。在你的情况下,单个差异是在填充规则中使用 - 空格或随机数字。

从理论上讲,您可以添加某种布尔标志或“类型”参数,然后在函数内部执行ifswitch以选择所需的行为。这是一个可怕的设计。随着添加更多选项,您的功能将会不断增长和增长。这是一个答案采取的方法,不幸的是目前接受的答案。

相反,因为在这种情况下差异在行为,代表那些不同的行为作为要回调的函数。这就是功能所代表的 - 代表行为!您的功能将有签名pad(string, length, padFunc)。这是一个更好的方法,是其他答案所采用的方法。但是,恕我直言,至少有一个这样的答案设计得有点糟糕,它将padFunc的含义超载为函数或字符串。

一个现代化的,功能性的方法是写一个创建基于规则的填充功能的高阶函数,调用下面fn

function padder(fn) { 
    return function(string, length) { 
    while (string.length < length) string += fn(string, length); 
    }; 
} 

(我传递stringlength到填充功能,以防万一它要使用他们的任何东西,或它可能忽视它们)

现在做轧染机与空白填补:。

const blankPadder = padder(() => ' '); 

或者使轧染机可实现随机数字填补:

const randomPadder = padder(() => Math.floor(Math.random() * 10)); 

铁杆功能程序员可以写这些为:

const K  = k =>() => k; 
const random = n =>() => Math.floor(Math.random() * n); 

const blankPadder = padder(K(' ')); 
const randomPadder = padder(random(10)); 

这里K是为K combinator传统名称,函数返回一个总是返回相同值的函数。

+0

我正在使用的环境在尝试使用任一'const'时给我一个模棱两可的语法错误。你能否提出另一种使用方法? –

+1

@Mhaase尝试使用'var'来代替,但是如果你的环境不喜欢'const',它可能也不喜欢箭头函数,所以你可能不得不将它们改写为'function(){return''; '等等。 –