javascript - 无论如何,在 Ramda 中是否可以使用路径和占位符?

标签 javascript ramda.js

我正在 Ramda 中尝试一些东西,并且我坚持尝试纯粹使用 Ramda 来获取对象深处的属性值。

我只能包装一个函数来接收路径中缺失的部分:

const fn = property => path(['a', 'b', property, 'd', 'e']);
fn('c')({ a: { b: { c: { d: { e: 1 } } } } });

我也尝试过使用 R.__ 但它根本不起作用:

path(['a', 'b', __, 'd', 'e'])

如果通过结果函数缺少 prop,我怎样才能使用纯粹的 Ramda 获得该对象内的 1

最佳答案

回答“问题的召唤”(指导性):

const fn = R.pipe(
  R.insert(2, R.__, ['a', 'b', 'd', 'e']),
  R.path(R.__, { a: { b: { c: { d: { e: 1 } } } } })
)

fn('c') //=> 1

回答“实际问题”(假设数据流不合理):

const fn = R.compose(
  R.path,    // see NOTE
  R.insert(2, R.__, ['a', 'b', 'd', 'e'])
)

fn ('c') ({ a: { b: { c: { d: { e: 1 } } } } }) //=> 1

您的问题暗示您将在知道丢失的路径键(“问题的调用”)之前知道将要查询的对象。如果您在知道数据之前就知道路径键,那么只需使用以下方法来求解数据而不是路径即可。如果您同时知道丢失的键和数据,那么您可以只调用该函数,或者根据情况可能需要使用超出问题范围的组合器。

注意:在 Ramda 中,pipe 的工作方式与 compose 相反,因此您可以使用 pipe 来代替并切换参数;但是,其他库对 composepipe 具有更严格的定义,这会将 pipe 的参数限制为一元函数,因此 compose 是首选,尽管在这种情况下是等效的。

说明:

您走在正确的道路上,您只需要稍微调整一下几个概念。

首先,R.__ 旨在代替未知参数(整个参数)。在这里,您错误地尝试在参数中使用 R.__ 。考虑以下因素:

const add = (x, y) => x + y
const curriedAdd = R.curry(add)

// the following are equivalent
const add2 = placeholder => add(placeholder, 2)
const add2 = curriedAdd(R.__, 2)

希望从上面可以清楚地看出,R.__ 只是一种表达方式:“嘿 Javascript,我还不知道这个参数的值,请保存以下参数:我确实知道并等待运行这个函数,直到我知道其余的参数。”它是围绕您在问题中提出的解决方案的语法糖(顺便说一下,这是一种完全可以接受的解决问题的方法)。

其次,你只需要进一步分解你的问题。从您已知的信息开始,向您不知道的信息努力。你的问题假设你知道你的道路上的所有要素,除了一个;但是,您还知道缺失属性的索引,即 2:

// from question
['a', 'b', property, 'd', 'e']

奇怪的是,您会知道路径的所有其他元素和未知键的索引,但是,嘿,我认为这是假设的。在这种情况下,可以使用R.insertR.__来表示已知和未知信息:

R.insert(2, R.__, ['a', 'b', 'd', 'e'])

您的问题暗示您将先知道要查询的对象,然后才能知道丢失的路径键(“问题的调用”)。

// from question
{ a: { b: { c: { d: { e: 1 } } } } }

如果您不知道路径的所有元素,那么在调用 R.insert 之前您将无法知道完整路径。相反,一旦调用R.insert,您就会知道完整路径。首先,考虑在您还不知道路径的情况下 R.path 会是什么样子:

R.path(R.__, { a: { b: { c: { d: { e: 1 } } } } })

所以,把它们放在一起:

  1. 在使用丢失的键调用 fn 之前,我们不会知道完整路径。
  2. 一旦我们知道了路径,我们就可以调用 R.path 来检索该值。

这种一步一步的数据流是基本的函数组合,可以用R.pipe简洁地表达。

同样,奇怪的是您会知道数据和除一个之外的所有路径键。但是,上述方法和思维过程可以转移到您的现实情况中,该情况可能依赖于R.insert,但需要您逐步构建路径,然后将所述路径传递给 R.path

关于javascript - 无论如何,在 Ramda 中是否可以使用路径和占位符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57047659/

相关文章:

javascript - 对数组执行函数列表

javascript - jQuery如何获取所有输入字段的值

javascript - 在 JavaScript 中将文件对象转换为图像对象

ramda.js - 使用 Ramda 简化数组计算

javascript - Ramda lib - javascript - 数据重构/分组

javascript - 在 Ramda 中做一些无积分的事情

javascript - DateRangePicker - autoUpdateInput :false, autoapply:true 不起作用

javascript - 直接打开表单 View 窗口而不是日历 Odoo 10 上的摘要窗口

javascript - 我如何以循环方式为图像制作动画?`

javascript - 了解 Ramda 中转换器的使用