2015-05-07 8 views
11

Używam aplikacji immutable.js z moją aplikacją flux. Jest to bardzo przydatne i zapewnia zwiększenie wydajności. Ale to, co mnie naprawdę zasmuca, to fakt, że nie mogę używać razem z nim lodash. Lodash zapewnia wspaniałe API z mnóstwem przydatnych funkcji, więc zastanawiam się, czy jest jakiś sposób, żeby je połączyć, żeby dla mnie działały?Jakimkolwiek sposobem używania immutable.js z lodash?

+2

Może podać kod, którego próbujesz użyć, co ilustruje _how_ dwie biblioteki nie działają razem? –

+0

Nie widzę sposobu, w jaki mogłyby współpracować ze sobą, ponieważ lodash obsługuje tablice javascript i obiekty - immutable.js zastępuje je własnymi listami i mapami. – OlliM

+0

Możesz również sprawdzić https://github.com/engineforce/ImmutableAssign, który obsługuje niezmienność i pozwala ci kontynuować pracę z POJO (Plain Old JavaScript Object). – engineforce

Odpowiedz

3

I niedawno napisał otoki Lodash zapewniając Immutable.JS wsparcie nazywa mudash. Większość głównych funkcji Lodasha jest obsługiwanych przez regularne dodawanie kolejnych.

6

Domyślam się, że próbujesz zrobić coś w stylu mapy z zamkiem na niezmiennym zestawie. Lodash nie robi użytecznych rzeczy, gdy próbujesz to zrobić bezpośrednio.

Zauważ, że immutable.js ma już wiele własnych funkcji manipulacyjnych (jak map), a także własne leniwy łańcuch (przez Seq), więc powinieneś zajrzeć do nich.

Jeśli musisz zrobić coś, co zapewnia lodash, a immutable.js nie, jedną rzeczą, którą możesz zrobić, to wziąć swój niezmienny obiekt i przekształcić go w waniliowy obiekt JS do konsumpcji przez lodash. Na przykład:

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

Będziesz oczywiście trzeba wziąć pod uwagę wydajność tutaj, ponieważ może skończyć się najgorsze z obu światów, jeśli konwersji z jednego do drugiego, kopiując dane do wanilii struktura danych. Na przykład w przypadku z zabawkami lepiej byłoby, gdybyś użył bezpośrednio immutable.js map().

+6

Konwersja rzeczy z JS i JS wiele razy jest nie do przyjęcia dla mojego konkretnego przypadku. W każdym razie dowiedziałem się, że immutable.js ma duże API samo w sobie i w większości przypadków zastępuje lodash. W każdym razie dziękuję za odpowiedź –

+0

Mogę potwierdzić, że stałe korzystanie z haseł .fromJS() i .toJS() jest bardzo kosztowne. Sugerowałbym założenie, że całe drzewo stanu jest zamknięte w interfejsie API Immutable.js lub bardzo ostrożnie podchodzi do niego. –

5

Możesz użyć Ramda, jeśli chcesz mieć niezmienność i funkcje wolne od efektów ubocznych.

Biblioteka zawiera użyteczne funkcje podobne do zadań, ale funkcjonalny styl programowania, który nie powoduje mutacji danych użytkownika.

Zastanów się, this React example używając funkcji map w składni Ramda i ES6.

R.map(function, array); 
1

seamless-immutable ma na celu zapewnienie, że API jest wstecznie kompatybilny ze strukturami danych wanilia JS.

Pozwala to na używanie metod LINASA. Jednakże, ponieważ wiele metod LASHA jest napisanych z myślą o zmienności, są one prawdopodobnie dalekie od optymalnych.

1

Możesz wypróbować stworzoną przeze mnie https://github.com/engineforce/ImmutableAssign, która jest lekką, niezmienną pomocniczką, która obsługuje niezmienność i pozwala ci kontynuować pracę z POJO (Plain Old JavaScript Object). W związku z tym możesz użyć dowolnej funkcji LILASA.

np

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

Jak korzystać z withMutations w ImmutableJS?

Wyszukaj Batching Mutations w celu uzyskania krótkiego wyjaśnienia here.