J'utilise immutable.js avec mon application Flux. C'est très utile et donne de la performance. Mais ce qui me rend vraiment triste, c'est que je ne peux pas utiliser lodash avec. Lodash fournit une excellente API avec une tonne de fonctions utiles, alors je me demande s'il existe peut-être un moyen de les réunir pour fonctionner pour moi?
J'ai récemment écrit un wrapper Lodash fournissant le support Immutable.JS appelé mudash . La plupart des fonctions principales de Lodash sont prises en charge et d’autres sont ajoutées régulièrement.
Je suppose que vous essayez de faire quelque chose comme faire une carte lodash sur un ensemble immuable. Lodash ne fait pas des choses utiles lorsque vous essayez de le faire directement.
Notez que immutable.js a déjà beaucoup de ses propres fonctions de manipulation (comme map
) ainsi que son propre chaînage paresseux (via Seq
), vous devriez donc vous en occuper.
Si vous devez faire quelque chose que lodash
fournit et que immutable.js
ne fait pas, vous pouvez le faire en prenant votre objet immuable et en le convertissant en objet Vanilla JS pour qu'il soit consommé par lodash. Par exemple:
// Do all of your fancy immutable.js stuff...
my_set = immutable.Set([1,2,3]).union(immutable.Set([2,3,4]))
// ...and then convert to JS before you do all of your fancy lodash stuff
mapped_set = _(my_set.toArray()).map(whatever)
Vous devrez bien sûr prendre en compte les performances ici, car vous risquez de subir le pire des deux mondes si vous convertissez de l'un à l'autre en copiant vos données dans une structure de données Vanilla. Dans le cas des jouets ci-dessus, par exemple, vous feriez mieux d'utiliser directement un immutable.js map()
.
Vous pouvez utiliser Ramda si vous voulez des fonctions libres d’immutabilité et d’effets secondaires.
La bibliothèque fournit des fonctions utiles similaires à lodash mais dans un style de programmation fonctionnel qui ne mute jamais les données utilisateur.
Considérons cet exemple de réaction en utilisant la fonction map dans les syntaxes Ramda et ES6.
R.map(function, array);
Vous voudrez peut-être consulter https://github.com/engineforce/ImmutableAssign créé par moi-même, un assistant léger et immuable qui prend en charge l’immuabilité et vous permet de continuer à travailler avec POJO (Plain Old JavaScript Object) . Par conséquent, vous pouvez utiliser toutes les fonctions de lodash.
Par exemple.,
var iassign = require("immutable-assign");
var _ = require("lodash");
var o1 = { a: { c: 1 }, b: [1, 2, 3] };
var o2 = iassign(
o1,
function(o) { return o.b; }, // get property to be updated
function(b) { // update select property
return _.map(b, function(i) { return i + 1; });
}
);
// o2 = { a: { c: 1 }, b: [2, 3, 4] }
// o1 is not modified
// o2 !== o1
// o2.b !== o1.b
// o2.a === o1.a
Que diriez-vous d'utiliser withMutations dans ImmutableJS?
Recherchez Batching Mutations
pour une brève explication ici .
seamless-immutable a pour objectif de fournir une API rétrocompatible avec les structures de données Vanilla JS.
Cela vous permet d'utiliser des méthodes lodash. Cependant, étant donné que de nombreuses méthodes de lodash sont écrites dans une optique de mutabilité, elles sont probablement loin d'être optimales.