Jared Smith的回答很好。我只想补充一下为什么你的代码没有起作用。你尝试了
R.filter(R.props('a'), {a: 1, b: 2, c: 3, d: 4});
首先,您指向了prop
文档,但使用了props
。这些是不同但相关的函数。prop
看起来像
// prop :: k -> {k: v} -> v
prop('c', {a: 1, b: 2, c: 3, d: 4}); //=> 3
(有关undefined
,存在一些额外的复杂性。)
props
另一方面可以采用多个值。
// props :: [k] -> {k: v} -> [v]
props(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> [1, 4]
但是这两种内容都不适合作为 filter
的输入。对于这个目的,我们可以将其视为
// filter :: (k -> Bool) -> {k: v} -> {k: v}
filter
的第一个参数是一个从字符串键到布尔值的函数;它遵循 JavaScript 的一种思想,即除了一些特定的值之外,所有东西都是真值。函数将依次调用每个键。例如,在决定是否包含
{c: 3}
时,它会调用
props('a')('c')
,由于某种奇怪的原因
*,实际上也能工作,返回
[3]
,这被视为真值,过滤函数将在其输出中包含
{c: 3}
。因此,每个键也都将被包括在内。
* props('a', obj)
之所以能够工作,而真正应该是 props(['a'], obj)
,是因为在 JS 中,字符串足够接近列表,具有 length
属性和索引值。例如,'a'.length; ==> 1
,'a'[0]; //=> 'a'
。因此,props
可以将单个字符的字符串视为只包含一个字符的字符串列表。但这也可能有点奇怪:R.props('cabby', {a: 1, b: 2, c: 3, d: 4}); //=> [3, 1, 2, 2, undefined]
。