函数式编程/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 没有特定的内置函数。但是在 lensPathviewmap:

之上写一个并不难
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.

上看到这一点。