簡體   English   中英

如何使用 Ramda 從對象中過濾出特定鍵?

[英]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'鍵的新對象。 或者一個帶有ab鍵的新對象。

使用選擇

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

如果您的過濾條件比存在更復雜,您可以使用pickBy通過任意謂詞函數進行選擇。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM