这里是函数式编程新手。我有这个对象:
{
_id: '2014d5db-55dc-4078-ae87-382c226d0785',
_source: {
phone: '00447827434313',
...
}
}
最后我想采用这种格式:
{
id: '2014d5db-55dc-4078-ae87-382c226d0785',
phone: '00447827434313',
...
}
基本上提取_source
,并将_id
重命名为id
。
我创建了这个函数,它可以工作,但我尝试仅使用 Ramda 的函数,而不是手动创建新对象。我认为这是更“实用”的方式,如果这并不重要,请告诉我。
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 上看到此操作的实际效果。 。
关于javascript - 函数式编程/Ramda : Creating a new object by picking nested properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41447069/