2017-06-01 131 views
0

我想這deepMap([4,5, [3,4,[2]]], x => x + 5)通過這個功能:如何使用在Javascript中的參數中創建的函數?

const deepMap = (arr, fn) => { 
    return arr.reduce((first, second) => first.concat(Array.isArray(second) ? [deepMap(second)] : fn), []); 
} 

以前,它的工作是這樣的:

const deepMap = (arr, fn) => { 
    return arr.reduce((first, second) => first.concat(Array.isArray(second) ? [deepMap(second)] : second + 5), []); 
} 

但是這並沒有讓我使用該函數的第二個參數。我知道它需要像第二個例子那樣工作,但我能想到改變它的唯一方式就像在第一個例子中那樣。我嘗試了許多變化,但我一直在收到錯誤或錯誤的答案。

+0

'Array.concat'期望的陣列 - '[第二+ 5]'? – jonrsharpe

+0

在'deepMap'函數內部,作爲參數傳遞的函數名爲'fn',所以你把它叫做'fn(xyz)'。如果您希望隨後對'deepMap'進行遞歸調用以便能夠調用它,則必須將其傳遞:'deepMap(second,fn)'。 –

+0

您是否收到任何錯誤? – Olga

回答

0

只需將數組和函數傳遞給遞歸調用deepMap並調用fn(cur)而不是指向它。

const deepMap = (arr, fn) => { 
 
    return arr.reduce((first, second) => first.concat(Array.isArray(second) ? [deepMap(second, fn)] : fn(second)), []); 
 
} 
 

 
const res = deepMap([4,5, [3,4,[2]]], x => x + 5); 
 

 
console.log(res)

+0

沒有解釋沒有幫助 – mhodges

+1

@mhodges我在添加它時正在撰寫此評論。 – wostex

1

,你應該把函數的返回值,而不是函數本身。像這樣:

const deepMap = (arr, fn) => { 
    return arr.reduce((first, second) => first.concat(Array.isArray(second) ? [deepMap(second, fn)] : fn(second)), []); 
} 
+0

您的代碼不起作用。內部'deepMap'應該被調用爲'deepMap(second,fn)',而不是'deepMap(second)' – wostex

+0

好的,修復,謝謝wostex – Nosyara

相關問題