Javascript 如果键和值都匹配,Ramda将忽略它们

Javascript 如果键和值都匹配,Ramda将忽略它们,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我有一个包含一些数据的对象。我想挑出某些键,然后如果它们都匹配的话也省略一个键和值。这是我的目标: const obj = { title: 'some title', description: 'some descrption', image: 'default_image.png' } 我想做的是,提取描述和图像,然后省略图像,如果它的值为'default\u image.png' const fn = R.compose( // if image === 'default

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

const obj = {
  title: 'some title',
  description: 'some descrption',
  image: 'default_image.png'
}
我想做的是,提取
描述
图像
,然后省略
图像
,如果它的值为
'default\u image.png'

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

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

您可以创建两个不同的函数和一个布尔函数,用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))

您可以创建两个不同的函数和一个布尔函数,用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))

我可能会这样做

const fn = pipe(
  when(propEq('image', 'default_image.png'), dissoc('image')),
  pick(['description', 'image'])
);
返回删除了特定键的对象的副本。测试对象的给定属性是否与提供的值匹配。并接受一个谓词和一个转换函数。如果谓词与提供的数据匹配,则返回对该数据调用转换函数的结果,否则返回的数据将保持不变

请注意,我选择了而不是。唯一的区别是
pick
跳过找不到的键,
pickAll
返回值为
undefined

您可以在中看到这一点

如果总是对列表而不是单个对象进行操作,则可以从
pick
切换到:


这一个也可以在

上找到,我可能会这样做

const fn = pipe(
  when(propEq('image', 'default_image.png'), dissoc('image')),
  pick(['description', 'image'])
);
返回删除了特定键的对象的副本。测试对象的给定属性是否与提供的值匹配。并接受一个谓词和一个转换函数。如果谓词与提供的数据匹配,则返回对该数据调用转换函数的结果,否则返回的数据将保持不变

请注意,我选择了而不是。唯一的区别是
pick
跳过找不到的键,
pickAll
返回值为
undefined

您可以在中看到这一点

如果总是对列表而不是单个对象进行操作,则可以从
pick
切换到:


这一个也可以在

上找到,对
R.compose
的调用是不必要的。@ScottSauyet niice!看起来好多了对
R.compose
的调用是不必要的。@ScottSauyet niice!看起来好多了