2017-03-05 39 views
0

我有一個包含一些數據的對象。我想挑選某些關鍵字,然後如果它們都匹配,則也省略關鍵字和值。這是我的目標:拉姆達省略鍵和值,如果它們都匹配

const obj = { 
    title: 'some title', 
    description: 'some descrption', 
    image: 'default_image.png' 
} 

我想怎麼辦,是提取descriptionimage,然後省略image若有'default_image.png'值。

const fn = R.compose(
    // if image === 'default_image.png' then omit it 
    R.pickAll(['description', 'image']) 
) 

不知道什麼是最好的ramda函數用於上述的第二部分。

回答

2

我會可能做類似

const fn = pipe(
    when(propEq('image', 'default_image.png'), dissoc('image')), 
    pick(['description', 'image']) 
); 

dissoc返回刪除特定鍵的對象的副本。 propEq測試對象的給定屬性是否與提供的值匹配。並且when具有謂詞和轉換功能。如果謂詞與提供的數據相匹配,則返回該數據的調用轉換函數的結果,否則返回的數據不變。

請注意,我選擇了pick而不是pickAll。唯一的區別是pick跳過它找不到的鍵,pickAll返回值爲undefined

您可以在Ramda REPL中看到此內容。

如果你總是要一個列表,而不是單獨的對象進行操作,就可以切換從pickproject

const fn = pipe(
    project(['description', 'image']), 
    map(when(propEq('image', 'default_image.png'), dissoc('image'))) 
); 

fn(objects); 

這一個是也可在Ramda REPL

+0

多麼美妙的答案,謝謝你斯科特! – gosseti

2

您可以創建兩個不同的功能,並且爲現場檢查與ramda的ifElse

const obj1 = { 
    title: 'some title', 
    description: 'some descrption', 
    image: 'default_image.png' 
} 

const obj2 = { 
    title: 'title', 
    description: 'descrption', 
    image: 'image.png' 
} 

const withImage = R.pickAll(['description', 'image']); 
const withoutImage = R.pickAll(['description']); 
const hasDefault = obj => obj['image'] == 'default_image.png' 

const omit = R.ifElse(hasDefault, withoutImage, withImage); 

console.log(omit(obj1)); 
console.log(omit(obj2)); 

我能想到的最簡單的方法將其應用於一個布爾函數使用pickBy

const hasDefault = (val, key) => key == 'image' && val == 'default_image.png' ? false : true 
console.log(R.pickBy(hasDefault, obj1)) 
console.log(R.pickBy(hasDefault, obj2)) 
+1

對'R.compose'的調用是不必要的。 –

+0

@ScottSauyet niice!它看起來更好 –