2017-06-01 134 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

相关问题