ImmutableJS vs Ramda或ImmutableJS + Ramda - 它们可以一起使用

问题描述 投票:0回答:2

我正在探索这两个库,对我来说ImmutableJS(大多数)是不可变数据结构,而Ramda有瑞士军刀FP utils。

当我谷歌时,我看到像RamdaImmutableJS这样推荐其中一篇的文章,但乍一看,至少对我来说,它们相互补充。

我可以想象我在React应用程序中的所有数据结构都是ImmutableJSListSetMapRecord),但是使用Ramda来组合函数,在ImmutableJS集合上进行转换等,或者当我错过uniq等功能时。

你怎么看?这是明智的做法吗?

functional-programming immutable.js ramda.js
2个回答
3
投票

他们可以一起使用;不顺利或无缝。

这很可能是一种方法,正如目前的情况一样,将导致你至少遇到一些困难,而且很可能是一个很大的困难。原因是不可变的结构与ramda的函数不兼容。您可以创建包装器或互操作来修补此功能,但这似乎是一个相当大的项目。

This issue进一步详细介绍,并包括一些可能的替代品,如List.

这是一个很小的例子,说明为什么缺乏互操作性是一个问题:

const { Map } = Immutable;
const { path } = R;

const standardObject = {a: 1, b: 2, c: 3};
const map1 = Immutable.Map(standardObject);

const getA = path(['a']);

const result = getA(map1);
const defaultResult = getA(standardObject);

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

你可能会把转化建立在你在ramda做的工作中;这似乎是解决问题的最简单方法,尽管它确实意味着您将代码与不可变数据结构紧密联系在一起。这可能是这样的:

const { Map } = Immutable;
const { path, pipe } = R;

const standardObject = {a: 1, b: 2, c: 3};
const map1 = Immutable.Map(standardObject);

const toStandard = map => map.toObject()

const getA = pipe(
  toStandard,
  path(['a'])
)

const result = getA(map1)

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

0
投票

Ramda提供免费的一些集成。 Ramda将其许多调用委托给数据对象。大多数情况下,如果Ramda函数的名称与Immutable方法的名称相同,那么Ramda将执行集成。

这意味着您通常可以使用不可变列表或映射到Ramda,您通常使用数组或对象。

const {Map, List} = immutable
const {map, filter, find} = ramda

const square = n => n * n
const isEven = n => n % 2 == 0

const xs = new List([1, 2, 3, 4, 5])

console.log(map(square, xs)) //=> List [1, 4, 9, 16, 25]
console.log(filter(isEven, xs)) //=> List [2, 4]
console.log(find(n => n > 3, xs)) //=> 3

const x = new Map({a: 1, b: 2, c: 3, d: 4, e: 5});

console.log(map(square, x))
//=> Map {"a" => 1, "b" => 4, "c" => 9, "d" => 16, "e" => 25}
console.log(filter(isEven, x)) //=> Map {"c" => 3, "d" => 4, "e" => 5}
<script src="https://bundle.run/[email protected]"></script>
<script src="https://bundle.run/[email protected]"></script>

但是,现在这是有限的共享名称。并非所有Ramda的功能都以这种方式委托。

正如Oliver Radini所提到的the issue描述的那样,我真的有兴趣让Ramda更容易与Immutable这样的工具进行进一步的集成,但它从来没有成为列表的顶端,并且Ramda贡献者之间存在一些真正的阻力。 。

© www.soinside.com 2019 - 2024. All rights reserved.