我有一个包含一些数据的对象。我想挑选某些键,然后如果两者都匹配,也会省略键和值。这是我的目标:
const obj = {
title: 'some title',
description: 'some descrption',
image: 'default_image.png'
}
我想要做的是提取description
和image
,如果image
的值为'default_image.png'
,则省略const fn = R.compose(
// if image === 'default_image.png' then omit it
R.pickAll(['description', 'image'])
)
。
{{1}}
不确定上面第二部分使用的最佳ramda函数是什么。
答案 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 也可以使用。