2017-05-20 58 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''; '等等。 –