2017-04-10 55 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]