Ramda中的等价Lodash.get函数

5
有没有内置的 Ramda 函数可以根据字符串路径检索值?例如:
R.path('a.b', {a: {b: 2}}); // I want to get 2

我知道可以使用数组来实现路径相关的操作,例如:path
R.path(['a', 'b'], {a: {b: 2}});

我可以按 . 分割路径,然后使用它,但在此之前,我想知道是否有一个已经可用的函数,类似于 lodash.get

1个回答

3
Ramda不能像lodash一样处理字符串路径。但是,你可以使用R.pipeR.split生成一个非常相似的函数。Split用于将带有点(.)和括号的数组转换为一个数组,以便R.path可以处理。
注意:这是一个非常天真的实现,由于JS中什么是有效对象键,它将在各种边缘情况下失败。例如,像这样的边缘情况['a.b'] - 从类似{ 'a.b': 5 }这样的对象获取属性a.b。要处理边缘情况,你必须实现类似于lodash内部的stringToPath()函数。

const { pipe, path, split } = R;

const pathString = pipe(split(/[[\].]/), path);

const result = pathString('a.b')({a: {b: 2}});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>


1
在这里使用Ramda可能只会增加(很多?)不必要的开销。大约5年前,在我了解lodash的get/set之前(可能是在它们被添加到库中之前),我用原生JavaScript编写了我需要的内容。并不是要批评你的答案,只是一个观察。 - Dexygen
我认为如果你想使用Ramda,就坚持使用数组路径。 - Ori Drori
1
@GeorgeJempty:Ramda最初有字符串版本,但存在一个故障模式,团队不愿意接受,即名称中带有点的键。编写此函数非常容易(可能只是(p,o) => p.split('.').reduce((o,k) => (o || {}) [k],o),我没有测试),但确定它是否是正确的函数对于用户代码与公共库来说是非常不同的调用。 - Scott Sauyet
2
@OriDrori:我认为没有理由不使用你上面提供的版本,而不是Ramda提供的版本。但是你必须确信你的对象中不包含带有点的键。库无法知道这一点,但你可以针对你自己的代码库进行了解。 - Scott Sauyet
我也不会尝试支持大括号。a.1.b应该可以用来获取对象a中索引为1的数组元素的b属性。因此,这可以简化为我在评论George时发布的内容。但是,如果目标是将Lodash代码移植到Ramda,则情况可能会有所不同。 - Scott Sauyet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接