函数式编程/Ramda:通过选取嵌套属性创建新对象
Functional programming / Ramda: Creating a new object by picking nested properties
这里是函数式编程新手。我有这个对象:
{
_id: '2014d5db-55dc-4078-ae87-382c226d0785',
_source: {
phone: '00447827434313',
...
}
}
最后我想要这样的格式:
{
id: '2014d5db-55dc-4078-ae87-382c226d0785',
phone: '00447827434313',
...
}
基本上提取_source
,并将_id
重命名为id
。
我在下面创建了这个有效的函数,但我尝试只使用 Ramda 的函数而不是手动创建新对象。我认为它更 "functional" 方式,如果它真的不重要,请告诉我。
const test = o => merge(o._source, { id: o._id })
非常感谢
我认为 Ramda 没有特定的内置函数。但是在 lensPath
、view
和 map
:
之上写一个并不难
const remap = R.curry((desc, obj) => R.map(path => R.view(R.lensPath(path), obj), desc));
const myExtract = remap({
id: ['_id'],
phone: ['_source', 'phone']
});
myExtract(input);
//=> {"id": "2014d5db-55dc-4078-ae87-382c226d0785", "phone": "00447827434313"}
只有当您的输出被描述为字段的平面列表(当然它们的属性本身可以是对象)时,它才有效。但是您从嵌套路径中拉出并推送到嵌套路径的地方不会太多更难写。不过,我想用户 API 会更丑。
我看不出有什么干净的方法可以使这个点免费并且仍然保持可读性。也许其他人可能会做到这一点,但我认为这已经很不错了。
您可以在 Ramda REPL.
上看到这一点。
这里是函数式编程新手。我有这个对象:
{
_id: '2014d5db-55dc-4078-ae87-382c226d0785',
_source: {
phone: '00447827434313',
...
}
}
最后我想要这样的格式:
{
id: '2014d5db-55dc-4078-ae87-382c226d0785',
phone: '00447827434313',
...
}
基本上提取_source
,并将_id
重命名为id
。
我在下面创建了这个有效的函数,但我尝试只使用 Ramda 的函数而不是手动创建新对象。我认为它更 "functional" 方式,如果它真的不重要,请告诉我。
const test = o => merge(o._source, { id: o._id })
非常感谢
我认为 Ramda 没有特定的内置函数。但是在 lensPath
、view
和 map
:
const remap = R.curry((desc, obj) => R.map(path => R.view(R.lensPath(path), obj), desc));
const myExtract = remap({
id: ['_id'],
phone: ['_source', 'phone']
});
myExtract(input);
//=> {"id": "2014d5db-55dc-4078-ae87-382c226d0785", "phone": "00447827434313"}
只有当您的输出被描述为字段的平面列表(当然它们的属性本身可以是对象)时,它才有效。但是您从嵌套路径中拉出并推送到嵌套路径的地方不会太多更难写。不过,我想用户 API 会更丑。
我看不出有什么干净的方法可以使这个点免费并且仍然保持可读性。也许其他人可能会做到这一点,但我认为这已经很不错了。
您可以在 Ramda REPL.
上看到这一点。