首页 > 解决方案 > ImmutableJS vs Ramda 或 ImmutableJS + Ramda - 它们可以一起使用吗

问题描述

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

当我用谷歌搜索时,我会看到类似Ramdavs的文章ImmutableJS推荐其中一个,但乍一看,至少在我看来,它们是相辅相成的。

我可以想象我在React应用程序中的所有数据结构都是ImmutableJS( List, Set, Map, Record) 但用于Ramda组合函数、对ImmutableJS集合进行转换等或当我错过一些功能时,例如uniq.

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

标签: functional-programmingimmutable.jsramda.js

解决方案


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

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

这个问题更详细,包括一些 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>


推荐阅读