如何使用 Ramda 从对象中过滤掉特定的键?

新手上路,请多包涵

http://ramdajs.com/0.21.0/docs/#prop

Ramda 回复

var myObject = {a: 1, b: 2, c: 3, d: 4};

var newObject = R.filter(R.props('a'), myObject);
//var newObject = R.filter(R.equals(R.props('a')), myObject);

console.log('newObject', newObject);

现在上面的代码正在返回整个对象:

newObject {"a":1,"b":2,"c":3,"d":4}

我想做的只是返回一个只有 'a' 键的新对象。或者使用 ab 键的新对象。

原文由 Leon Gaban 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 469
2 个回答

使用 选择

 let newObj = R.pick(['a'], oldObj);

如果您的过滤条件比存在性更复杂,您可以使用 pickBy 通过任意谓词函数进行选择。

原文由 Jared Smith 发布,翻译遵循 CC BY-SA 3.0 许可协议

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] ,它被处理作为 truth-y,过滤器函数将在其输出中包含 {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]

原文由 Scott Sauyet 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题