web-dev-qa-db-ja.com

Ramdaを使用してオブジェクトから特定のキーを除外するにはどうすればよいですか?

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

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'キー。または、aキーとbキーを持つ新しいオブジェクト。

9
Leon Gaban

pick を使用:

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

フィルタリング基準が単なる存在よりも複雑な場合は、 pickBy を使用して、任意の述語関数を介して選択できます。

14
Jared Smith

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]

6
Scott Sauyet