繁体   English   中英

函数式编程/ 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的功能,而不是手工创建新对象。 我认为这是一种更“实用”的方式,请让我知道这是否真的无关紧要。

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上看到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM