9

我正在寻找具有持久数据结构的功能库。我只需要嵌套数组和字典。有一些功能性的 javascript 库,但它们不适合不变性。我希望能够写作

var dict = makeDictionary({
  'foo': 1;
  'bar': {
     'ely': 2;
  }
});
var newDict = dict.assoc('foo', 42).assoc('bar', 'tender', 30).dissoc('bar', 'ely');
assert.eq dict.bar.ely, 2; // unchanged
assert.eq newDict.bar.tender, 30; // added
assert.eq newDict.bar.ely, undefined; // removed

虽然下划线在某些情况下很接近,特别是对于数组,但它会修改字典参数。我也可以使用clojurescript,但我更喜欢更轻量级的方法。

4

3 回答 3

8

我想看看森。它打包了 ClojureScript 的函数式数据结构,以便从普通的旧 Javascript 中使用。由于数据结构来自 ClojureScript,我希望它们比其他库得到更好的测试、更完整和更高的性能。

https://github.com/swannodette/mori

于 2013-11-10T23:28:07.037 回答
3

我完成了 JavaScript 的 Persistent Map 的实现(并将很快完成 Persistent Vector),因为似乎有越来越多的需求。

与 Java 相比,有几个细节(缺少 equals、hashCode 依赖),因此实现使用排序平衡二叉树(平衡实际上是通过不变性简化和加速的)和 === 用于相等和 < 或自定义函数低于。

Feat.js 的代码(项目代码名称)可在github.com 上的feat-sorted-map.js 获得

您可以在cofylang.org 上的 feat.js 上在线查看包含工作测试的页面

目前,除了源代码和测试之外没有任何文档,但我也在努力完成它。

更新:那里也有一个持久向量的实现,并且速度已经提高了几个数量级。(它也被清理了)github.com 上的 feat-vector.js

于 2012-05-03T13:36:16.637 回答
0

还有:

https://github.com/hughfdjackson/immutable

它基于这里的持久哈希树算法:

https://github.com/hughfdjackson/persistent-hash-trie

可能值得研究。

恕我直言,此代码更好,但我的基准测试表明它的运行速度比上面列出的慢了近一个数量级。

于 2013-06-21T21:36:17.377 回答