[英]How to filter out specific keys from object using Ramda?
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
鍵的新對象。
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'.length; ==> 1
, 'a'[0]; //=> 'a'
'a'[0]; //=> 'a'
。 因此props
可以將單字符串視為字符串的單元素列表。 但它也可能有點奇怪: R.props('cabby', {a: 1, b: 2, c: 3, d: 4}); //=> [3, 1, 2, 2, undefined]
R.props('cabby', {a: 1, b: 2, c: 3, d: 4}); //=> [3, 1, 2, 2, undefined]
.
const getOnlyGoods = R.pickBy((_, key) => key.includes('good')); const onlyGoods = getOnlyGoods({ "very good": 90, "good": 80, "good enough": 60, "average": 50, "bad": 30, "😡": 10, }); console.log(onlyGoods);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.