http://ramdajs.com/0.21.0/docs/#prop
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'
キー。または、a
キーとb
キーを持つ新しいオブジェクト。
JaredSmithからの回答は素晴らしいです。私はあなたのコードが機能しなかった理由についてのメモを追加したかっただけです。あなたがしようとした
_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')
を呼び出します。これは、もう1つの少し奇妙な理由です。*は実際に機能し、_[3]
_を返します。これはtruth-yとして扱われ、フィルター関数は出力に_{c: 3}
_を含めます。したがって、すべてのキーも含まれます。
*props('a', obj)
が実際にprops(['a'], obj)
である必要があるときに機能する理由は、JSでは、文字列がリストに十分に近く、length
プロパティとインデックス付きの値があるためです。 _'a'.length; ==> 1
_、_'a'[0]; //=> 'a'
_。したがって、props
は、単一文字列を文字列の1要素リストであるかのように扱うことができます。しかし、それも少し奇妙なことがあります:R.props('cabby', {a: 1, b: 2, c: 3, d: 4}); //=> [3, 1, 2, 2, undefined]
。