2017-06-05 34 views
2

我有下面的代码,我想填补id,所以我想写点东西像这样:ramda findIndex有间隙

const data = [ 
{ id: 'some-id' }, 
{ id: 'some-other-id' }, 
{ id: 'third-id' }, 
]; 

const tabIndex = R.findIndex(R.propEq('id', R.__))(data); 

所以我可以用它像这样tabIndex('third-id'),但这不是一个功能。 我对此有什么想法或混淆?

以下工作

const tabIndex = (id) => R.findIndex(R.propEq('id', id))(data); 

但我认为,这是R.__差距的功能点。

回答

3

我认为,目前要做到这一点最简单的方法是

const matchId = (id, data) => R.findIndex(R.propEq('id', id), data); 
matchId('third-id', data); //=> 2 

如果你真的想使这个自由点-,Ramda提供了多种功能,帮助,如useWithconverge(针对哪一个经常可以替代lift)这一次将采取useWith

const matchId = R.useWith(findIndex, [R.propEq('id'), R.identity]); 
matchId('third-id', data); //=> 3 

但我发现的第一个版本更具可读性。你可以在Ramda REPL找到。


请注意side note from EmissaryR.__占位符基本上用于显示您提供的参数在之间的空隙;作为最后的论点,它什么都不做。

3

我仍然试图自己掌握这个黑暗艺术,但我认为问题在于R.findIndex需要一个谓词(一个函数/断言)作为参数,并且不区分作为输入的谓词和常规curried函数。

要解决此新功能,可以组成(评估从右到左):

const data = [ 
 
    { id: 'some-id' }, 
 
    { id: 'some-other-id' }, 
 
    { id: 'third-id' } 
 
]; 
 

 
const tabIndex = R.compose(R.findIndex(R.__, data), R.propEq('id')); 
 

 
console.log(tabIndex('third-id')); // 2
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>

侧面说明:R.__占位符是缺少最右边的参数自动推断 - 例如R.propEq('id')R.propEq('id', R.__)是等同的。

+0

'findIndex'对函子一无所知;它只适用于列表(实际上只是密集的数组)。问题在于将参​​数置于恰当的位置,以便适当调用findIndex和propEq。 –

+0

@ScottSauyet谢谢你的澄清 - 抛开错误的术语,我仍然认为我所说的函数是有意义的,是否有一些“功能”的原因,我只是缺乏词汇或者只是一些尚未实施? – Emissary

+1

用作参数的函数的事情是它们必须具有正确的签名。所以'findIndex'的类型是'::(a - > Boolean) - > [a] - > Number'。在这种情况下,'a'只代表Object。所以传递给'findIndex'的谓词必须具有':: Object - > Boolean'类型。但'propEq'的类型为':: String - > b - > Object - > Boolean'。在我们将'propEq'函数传递给'findIndex'之前,我们必须部分应用'String'和'b'属性,留下一个':: Object - > Boolean'函数。我们可以按照您在这里的建议或我的答案中的任一版本来做到这一点。 (1/2) –