Ramda如果两者都匹配则省略键和值

时间:2017-03-05 15:20:16

标签: javascript functional-programming ramda.js

我有一个包含一些数据的对象。我想挑选某些键,然后如果两者都匹配,也会省略键和值。这是我的目标:

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']) )

{{1}}

不确定上面第二部分使用的最佳ramda函数是什么。

2 个答案:

答案 0 :(得分: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 :(得分: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

中看到这一点

如果您总是要操作列表而不是单个对象,则可以从pick切换到project

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

fn(objects);

Ramda REPL 也可以使用