Функциональная библиотека Javascript с постоянными структурами данных

Я ищу функциональную библиотеку с постоянными структурами данных. Мне нужны только вложенные массивы и словари. Есть несколько функциональных библиотек 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 ответа

Решение

Я завершил свою реализацию Persistent Map (и скоро завершу работу с Persistent Vector) для JavaScript, потому что, похоже, существует растущий спрос.

Есть несколько особенностей по сравнению, например, с Java (отсутствие равенства, hashCode, на который можно положиться), поэтому реализация использует отсортированное сбалансированное двоичное дерево (балансировка фактически упрощается и ускоряется благодаря неизменности) и === для равенства и <или пользовательская функция для ниже чем.

код Feat.js (кодовое название проекта) доступен по адресу feat-sorted-map.js на github.com

Вы можете увидеть страницу с рабочими тестами в действии онлайн на feat.js на cofylang.org

В настоящее время нет документации, кроме исходного кода и тестов, но я также работаю над ее завершением.

Обновление: там есть реализация постоянного вектора, и скорость была увеличена на порядки. (он также был очищен) feat-vector.js на github.com

Я бы посмотрел на Мори. Он упаковывает функциональную структуру данных ClojureScript для использования из простого старого Javascript. Поскольку структуры данных взяты из ClojureScript, я ожидаю, что они будут лучше протестированы, более полны и более производительны, чем другие библиотеки.

https://github.com/swannodette/mori

Есть также:

https://github.com/hughfdjackson/immutable

Который основан на постоянном алгоритме хеши здесь:

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

Может быть стоит посмотреть.

Код для этого лучше imho, но мои тесты показывают, что он работает почти на порядок медленнее, чем приведенный выше.

Самый популярный и, насколько я знаю, единственный, который все еще находится в активной разработке, — это https://immutable-js.com/.

но если вам нужен более богатый API, вы также можете использовать Mori, но я не уверен, что это будет намного более легкий подход, чем непосредственное использование ClojureScript.

Другие вопросы по тегам