2017-07-19 65 views
1

如何讓chain使用擴展參數(...chain)而不是數組?將數組轉換爲靜態參數

let newData, 
    newArgs, 
    chain = function (data, myargs) { 
     if (myargs.length === 0) { 
      return; 
     } 
     newData = myargs[0](data); 

     myargs.splice(0, 1); 
     newArgs = myargs; 
     // newargs === array 
     chain(newData, newArgs); 
    }, 
    add1 = (num) => { 
     return num + 1; 
    }; 

當我打電話的功能,我必須這樣做:chain(5, [add1, add1, add1])

但我想:chain(5, add1, add1, add1)

的問題是,即newArgs(遞歸的內部函數參數)被轉換成第一函數調用後的數組。

https://jsfiddle.net/btx5sfwh/

回答

2

你可能想使用rest arguments,然後spread數組調用函數遞歸

let newData, 
 
    newArgs, 
 
    chain = (data, ...myargs) => { 
 
    if (myargs.length === 0) { 
 
     return data; 
 
    } else { 
 
     newData = myargs[0](data); 
 
     myargs.splice(0, 1); 
 
     newArgs = myargs; 
 
     chain(newData, ...newArgs); 
 
    } 
 
    }, 
 
    add1 = (num) => { 
 
    return num + 1; 
 
    }; 
 

 

 
chain(5, add1, add1, add1); 
 

 
console.log(newData); // 8

+0

可是這樣一來,我不能再從這裏經過'... myargs'作爲一個REST的說法,** **裏面的功能。 –

+0

當然,你把數組傳回來。 – adeneo

+0

啊我看到了,所以當我使用'... myargs'而不是'myargs'時,它會自動轉換? –

2

時,您可以在一個更漂亮的方式寫chain

const chain = (x, f, ...fs) => 
 
    f === undefined 
 
    ? x 
 
    : chain (f (x), ...fs) 
 
    
 
const add1 = x => 
 
    x + 1 
 
    
 
console.log (chain (5, add1, add1, add1)) // 8 
 
console.log (chain (5))     // 5

休息參數和擴散參數是比較昂貴的壽 - 我們一般要限制這些的依賴,但我們不希望犧牲我們希望無論是API。

別擔心,還有更高層次的方式去思考這個問題。我們可以保留可變的API,但避免昂貴的擴展參數。

const chain = (x, ...fs) => 
 
    fs.reduce((x, f) => f (x), x) 
 

 
const add1 = x => 
 
    x + 1 
 

 
console.log (chain (5, add1, add1, add1)) // 8 
 
console.log (chain (5))     // 5