我有一个包含一些数据的对象。我想挑选一些键,然后在两者都匹配的情况下也省略键和值。这是我的对象:

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函数是什么。

最佳答案

我可能会做类似的事情

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上也提供了此功能。

关于javascript - Ramda如果两者都匹配,则省略键和值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42610104/

10-12 12:17