我有以下对象数组:
const originalArray = [
{name: 'name1', value: 10},
{name: 'name2', value: 20}
]和下面的对象
names = {
name1: 'generic_name_1',
name2: 'generic_name_2'
}我希望第一个数组像这样转换:
[
{name: 'generic_name_1', value: 10},
{name: 'generic_name_2', value: 20}
]到目前为止,我尝试了以下几点:
const replaceName = (names, obj) => {
if(obj['name'] in names){
obj['name'] = names[obj['name']];
}
return obj;
}
const modifiedArray = R.map(replaceName(names), originalArray)有没有更具ramda风格的方法呢?
发布于 2020-02-28 01:09:01
我不会为此使用任何Ramda函数。我会简单地避免改变原来的代码,也许代码是这样的:
const transform = (names) => (arr) => arr .map (
({name, ... rest}) => ({name: names [name] || name, ... rest})
)
const originalArray = [{name: 'name1', value: 10},{name: 'name2', value: 20}]
const names = {name1: 'generic_name_1',name2: 'generic_name_2'}
console .log (
transform (names) (originalArray)
)
发布于 2020-02-28 01:05:40
在Ramda函数中使用原生JS并不是不正确的。代码中唯一的问题是修改了原始对象-- obj['name'] = names[obj['name']];。
我将使用R.when检查names对象中是否存在该名称,如果存在,则将该对象演变为新名称。如果不是,则返回原始对象。
const { flip, has, prop, map, when, pipe, evolve } = R
const hasProp = flip(has)
const getProp = flip(prop)
const fn = names => map(when(
pipe(prop('name'), hasProp(names)),
evolve({
name: getProp(names)
})
))
const originalArray = [{"name":"name1","value":10},{"name":"name2","value":20},{"name":"name3","value":30}]
const names = {"name1":"generic_name_1","name2":"generic_name_2"}
const result = fn(names)(originalArray)
console.log(result)<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
https://stackoverflow.com/questions/60437218
复制相似问题