结合这些特定的JavaScript函数

时间:2017-05-20 04:26:32

标签: javascript function refactoring

我有两个单独的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;
}

3 个答案:

答案 0 :(得分:2)

考虑您想要组合的两个功能有何不同。然后“分解”这些差异以创建通用函数。在您的情况下,单个区别在于要使用的填充规则 - 空格或随机数字。

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

相反,由于在这种情况下差异在行为中,因此将这些不同的行为表示为要回调的函数。这就是函数的用途 - 代表行为!然后,您的函数将具有签名pad(string, length, padFunc)。这是一种更好的方法,也是其他一些答案所采用的方法。但是,恕我直言,其中至少有一个答案的设计有点差,它将padFunc的含义重载为函数或字符串。

一种现代的,功能性的方法是编写一个高阶函数,该函数根据规则创建一个填充函数,在下面称为fn

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

(我正在将stringlength传递给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));

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

答案 1 :(得分:-1)

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

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:-4)

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

&#13;
&#13;
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;
&#13;
&#13;