javascript - 函数式编程/Ramda : Creating a new object by picking nested properties

标签 javascript functional-programming ramda.js

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

{ 
  _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 上看到此操作的实际效果。

关于javascript - 函数式编程/Ramda : Creating a new object by picking nested properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41447069/

相关文章:

javascript - Require 在 NodeJS 应用程序中无法识别

javascript - 如何在 google map api 中更改缩放更改的标记

javascript - 无法使用 R.path 获取输入值

javascript - 附加到字符串 Ramda.js 的末尾

javascript - 如何通过react中的包装类公开内部组件的函数?

c++ - 以函数方式组合谓词

functional-programming - OCaml中的fold_tree

variables - 如何更改 Scheme 中的值但仅使用纯函数范式

javascript - 如何使用 Ramda 按值进行无点数组搜索

javascript - 计算过滤列的总和