【问题标题】:Javascript functional library with persistent data structures具有持久数据结构的 Javascript 函数库
【发布时间】:2012-05-08 06:09:09
【问题描述】:

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

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

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

【问题讨论】:

  • @FlavioCysne 我只是看了看,看不出它与我的问题有什么关系。
  • 只是为了澄清(因为我目前正在做一些非常相似的事情),您是否需要将生成的持久性地图作为包含“。”的本机对象。使用权?这将需要使用 getter 进行模拟,或者从修改中复制整个结构并将其冻结,这对于大型平面地图来说很快就会变得低效(并且都需要 ES5)......或者你对访问内容的函数/方法没问题(我的方法)?
  • 我对 doc-access 解决方案最满意,但看到了它的缺点。反正我没有大地图。 ES5 要求……好吧,我会考虑你的函数访问方法。
  • 我添加了一个替代方案(用于衡量与幼稚方法相比的性能提升)。我添加了天真的持久性地图“Nap”,它可以进行完整的写时复制。 assoc/dissoc 有两种变体,但是一旦你完成后你会得到一个原生对象(如果支持 ES5,可能会冻结)你可以像往常一样访问。

标签: data-structures functional-programming javascript persistent-data


【解决方案1】:

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

https://github.com/swannodette/mori

【讨论】:

    【解决方案2】:

    我完成了用于 JavaScript 的 Persistent Map(并将很快完成 Persistent Vector)的实现,因为需求似乎在增加。

    有几个细节相比,例如Java(缺少equals,hashCode依赖),所以实现使用排序平衡二叉树(平衡实际上是通过不变性简化和加速的)和===表示相等,

    Feat.js 的代码(项目代号)可在feat-sorted-map.js at github.com获取

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

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

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

    【讨论】:

    • @jJ,你做了什么来加快速度?
    • @Scott 在我的情况下我不得不放弃 Object.freeze,它只是因为它的缓慢而无法使用(jsperf.com/object-freeze-performance)。但除此之外,我尽可能多地使用具有单态函数的固定结构对象,这是最大的事情(对于直接访问、内联等)恕我直言。开发者工具中的 Profiler 是您最好的朋友。
    【解决方案3】:

    还有:

    https://github.com/hughfdjackson/immutable

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

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

    可能值得研究。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      相关资源
      最近更新 更多