Data structures 具有持久数据结构的Javascript函数库

Data structures 具有持久数据结构的Javascript函数库,data-structures,functional-programming,javascript,persistent-data,Data Structures,Functional Programming,Javascript,Persistent Data,我正在寻找一个具有持久数据结构的函数库。我只需要嵌套数组和字典。有一些,但它们不是针对不变性的。我想能够写作 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; // unchan

我正在寻找一个具有持久数据结构的函数库。我只需要嵌套数组和字典。有一些,但它们不是针对不变性的。我想能够写作

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

在某些情况下,特别是在数组中,它会修改字典参数。我也可以使用,但我更喜欢一种更轻量级的方法。

我完成了针对JavaScript的持久化映射(并将很快完成持久化向量)的实现,因为需求似乎在增加

与Java相比,有几个细节,例如Java(缺少equals,需要依赖的哈希代码),因此实现使用排序平衡二叉树(平衡实际上由于不变性而简化和加速)和===表示相等,<或自定义函数表示低于

Feat.js(项目代码名)的代码可在

您可以在以下位置联机查看包含正在运行的工作测试的页面:

目前,除了源代码和测试外,没有其他文档,但我也正在努力完成这项工作

更新:那里也提供了一个持久性向量的实现,速度已经提高了几个数量级。(它也被清理干净了)

还有:

它基于此处的持久散列trie算法:

也许值得研究一下


这方面的代码比imho更好,但我的基准测试表明它的运行速度比上面列出的要慢近一个数量级。

我想看看Mori。它打包了ClojureScript的功能数据结构,以便从简单的旧Javascript中使用。由于数据结构来自ClojureScript,我希望它们比其他库测试得更好、更完整、性能更好


@FlavioCysne我刚看了一下,看不出它与我的问题有什么关系。我只是想澄清一下(因为我目前正在做一些非常类似的事情),您是否需要生成的持久化映射作为本机对象,包括“.”访问?这需要使用getter进行模拟,或者从修改中复制整个结构并将其冻结,这对于大型平面贴图来说很快就会变得效率低下(并且都需要ES5)。。。或者您对访问内容的函数/方法(我的方法)满意吗?不过,我最满意的是文档访问解决方案,因为它有缺点。反正我也没有大地图。ES5要求。。。好吧,我要考虑一下您的函数访问方法。我添加了一个替代方法(相对于天真的方法来衡量性能提高)。我添加了朴素的持久映射“Nap”,它在写入时进行完整复制。assoc/dissoc有两种变体,但一旦完成,您将获得一个本机对象(如果支持ES5,可能会冻结),您可以像往常一样访问它。@jJ,您做了什么来加速它?@Scott在我的情况下,我不得不放弃object.freeze,它只是因为速度慢而无法使用()。但除此之外,我尽可能多地使用具有单态函数的固定结构对象,这是IMHO最大的优点(用于直接访问、内联等)。开发者工具中的探查器是您最好的朋友。