Gle*_*ift 12 javascript immutability lodash reactjs immutable.js
我在我的flux应用程序中使用了immutable.js.它非常有用,可以提升性能.但实际上让我感到难过的是我不能将lodash与它一起使用.Lodash提供了很棒的API,有很多有用的功能,所以我想也许有办法让它们在一起为我工作?
如果你想要不变性和无副作用的功能,你可以使用Ramda.
该库提供类似于lodash的有用函数,但是在函数式编程风格中从不改变用户数据.
考虑使用Ramda和ES6语法中的map函数的这个React示例.
import { flatten } from 'ramda';
const users = ['Steve Jobs', ['Steve Wozniak']];
const flatUsers = flatten(users);
// returns ['Steve Jobs', 'Steve Wozniak']
Run Code Online (Sandbox Code Playgroud)
我假设你正在尝试做一些像在不可变集上做一个lodash地图的事情.当您尝试直接执行此操作时,Lodash不会做有用的事情.
请注意,immutable.js已经有很多自己的操作函数(比如map
)以及它自己的lazy chaining(via Seq
)所以你应该研究那些.
如果你需要做一些lodash
提供和immutable.js
不提供的东西,你可以做的一件事就是把你的不可变对象转换成一个vanilla JS对象供lodash使用.例如:
// 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)
Run Code Online (Sandbox Code Playgroud)
你当然必须在这里考虑性能,因为如果你通过将数据复制到一个普通的数据结构中从一个转换到另一个,你最终可能会遇到最糟糕的两个世界.例如,在上面的玩具箱中,你最好map()
直接使用immutable.js .