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

当我用谷歌搜索时,我看到像 RamdaImmutableJS 这样的文章推荐了一个或另一个,但乍一看,至少对我来说,它们是相辅相成的。

我可以想象我在 React 应用程序中的所有数据结构都是 ImmutableJS ( ListSetMapRecord )但是使用 Ramda 来组合函数、对 ImmutableJS 集合进行转换等,或者当我错过一些像 uniq 这样的功能时

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

最佳答案

它们可以一起使用吗?不顺利或无缝。

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

This issue 更详细,包括一些潜在的 immutablejs 替代品,例如 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>

关于functional-programming - ImmutableJS vs Ramda 或 ImmutableJS + Ramda - 它们可以一起使用吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55537782/

10-12 03:27