2015-05-07 9 views
11

Ich verwende immutable.js mit meiner Flussmittelanwendung. Es ist sehr nützlich und gibt einen Leistungsschub. Aber was mich wirklich traurig macht, ist die Tatsache, dass ich lodash nicht zusammen mit ihm verwenden kann. Lodash bietet eine großartige API mit einer Menge nützlicher Funktionen, also frage ich mich, ob es vielleicht einen Weg gibt, sie zusammenzubringen, um für mich zu arbeiten?Eine Möglichkeit, immutable.js mit lodash zu verwenden?

+2

Vielleicht stellen Sie etwas Code zur Verfügung, den Sie verwenden möchten, der _how_ die beiden Bibliotheken nicht zusammen arbeiten veranschaulicht? –

+0

Ich sehe nicht, wie sie zusammenarbeiten könnten, wie Lodash JavaScript Arrays und Objekte behandelt - unveränderliche.js ersetzt sie durch seine eigenen Listen und Maps. – OlliM

+0

Sie können auch https://github.com/engineforce/ImmutableAssign auschecken, das die Unveränderlichkeit unterstützt und es Ihnen ermöglicht, weiterhin mit POJO (Plain Old JavaScript Object) zu arbeiten. – engineforce

Antwort

3

ich vor kurzem eine Lodash Wrapper bietet Immutable.JS geschrieben haben, unterstützen mudash genannt. Die meisten Lodash-Hauptfunktionen werden unterstützt, wobei regelmäßig mehr hinzugefügt wird.

6

Ich gehe davon aus, dass Sie versuchen, etwas wie eine lodash-Map auf einem unveränderlichen Satz zu tun. Lodash macht keine hilfreichen Dinge, wenn Sie versuchen, dies direkt zu tun.

Beachten Sie, dass immutable.js bereits eine Menge eigener Manipulationsfunktionen (wie map) sowie seine eigene faule Verkettung (über Seq) hat, also sollten Sie in diese schauen.

Wenn Sie etwas tun müssen, das lodash bietet und immutable.js nicht tut, ist eine Sache, die Sie tun können, nehmen Sie Ihr unveränderliches Objekt und konvertieren Sie es in ein Vanille JS-Objekt für den Verbrauch von Lodash. Zum Beispiel:

// 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) 

den Sie natürlich haben hier die Leistung zu berücksichtigen, da man mit dem schlechtesten aus beiden Welten landen können, wenn Sie durch das Kopieren von Daten in ein Vanille von einem zum anderen zu konvertieren Datenstruktur. In dem oben genannten Spielzeugfall wäre es beispielsweise besser, wenn Sie direkt eine immutable.js map() verwenden.

+6

Converting Sachen von JS und JS viele Male ist nicht akzeptabel für meinen speziellen Fall. Jedenfalls habe ich herausgefunden, dass immutable.js eine große API selbst hat und in den meisten Fällen lodash ersetzt. Wie auch immer, danke, dass du antwortest: –

+0

Ich kann bestätigen, dass die Verwendung von .fromJS() und .toJS() immer sehr aufwändig ist. Ich würde vorschlagen, entweder davon auszugehen, dass Ihr gesamter Statusbaum in der API von Immutable.js gekapselt ist, oder sehr vorsichtig damit umzugehen, wie Sie ihn einbinden. –

5

Sie könnten Ramda verwenden, wenn Sie unveränderliche und nebenwirkungsfreie Funktionen wünschen.

Die Bibliothek bietet nützliche Funktionen ähnlich wie lodash, jedoch in einem funktionalen Programmierstil, der niemals Benutzerdaten mutiert.

Betrachten Sie this React example mit der Kartenfunktion in Ramda und ES6-Syntax.

R.map(function, array); 
1

seamless-immutable zielt darauf ab, eine API zur Verfügung zu stellen, die nach hinten mit Vanille JS Datenstrukturen kompatibel ist.

Dies ermöglicht Ihnen die Verwendung von lodash-Methoden. Da viele Methoden von lodash jedoch mit dem Gedanken der Veränderlichkeit geschrieben wurden, sind sie wahrscheinlich weit davon entfernt, optimal zu sein.

1

Sie können überprüfen, https://github.com/engineforce/ImmutableAssign von mir erstellt, die eine leichte, unveränderliche Helfer ist, die Unveränderlichkeit unterstützt und ermöglicht es Ihnen, weiterhin mit POJO (Plain Old JavaScript Object) zu arbeiten. Daher können Sie jede lodash-Funktion nutzen.

Z. B.

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 
1

Wie wäre es mit withMutations in ImmutableJS zu verwenden?

Suchen Sie nach Batching Mutations für kurze Erklärung here.