2017-04-10 67 views
0

http://ramdajs.com/0.21.0/docs/#prop如何使用Ramda过滤掉对象中的特定键?

Ramda Repl

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键创建新对象。

+0

你想用一个你想要的钥匙取回一个物件吗? –

回答

4

使用pick

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

如果你的过滤标准不仅仅是存在更复杂,你可以使用pickBy通过任意谓词的功能选择。

4

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],这被视为真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]