我有两个单独的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 :(得分:2)
考虑您想要组合的两个功能有何不同。然后“分解”这些差异以创建通用函数。在您的情况下,单个区别在于要使用的填充规则 - 空格或随机数字。
理论上,您可以添加某种布尔标志或“类型”参数,然后在函数内部执行if
或switch
以选择所需的行为。这是一个可怕的设计。随着您添加更多选项,您的功能将会增长和增长。这是一个答案所采用的方法,不幸的是,目前已经接受了答案。
相反,由于在这种情况下差异在行为中,因此将这些不同的行为表示为要回调的函数。这就是函数的用途 - 代表行为!然后,您的函数将具有签名pad(string, length, padFunc)
。这是一种更好的方法,也是其他一些答案所采用的方法。但是,恕我直言,其中至少有一个答案的设计有点差,它将padFunc
的含义重载为函数或字符串。
一种现代的,功能性的方法是编写一个高阶函数,该函数根据规则创建一个填充函数,在下面称为fn
:
function padder(fn) {
return function(string, length) {
while (string.length < length) string += fn(string, length);
};
}
(我正在将string
和length
传递给padding函数,以防它想要将它们用于任何事情。或者它可以忽略它们。)
现在制作一个用空白垫填充的垫子:
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的传统名称,该函数返回一个总是返回相同值的函数。
答案 1 :(得分:-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));
&#13;
.as-console-wrapper { top: 0; max-height: 100% !important; }
&#13;
答案 2 :(得分:-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);
&#13;