这里是函数式编程新手。我有这个对象:

{
  _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函数。但是在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上看到此操作。

10-04 12:54