我正在使用immutable.js和我的助焊剂应用程序。它非常有用,可以提升性能。但实际上让我感到难过的是,我不能将lodash与它一起使用。 Lodash提供了很棒的API,有很多有用的功能,所以我想也许有办法让它们在一起为我工作?
我最近写了一个Lodash包装器,提供了名为mudash的Immutable.JS支持。大多数主要的Lodash功能都支持更多定期添加。
如果你想要不变性和无副作用的功能,你可以使用Ramda。
该库提供类似于lodash的有用函数,但是在函数式编程风格中从不改变用户数据。
考虑使用ES6语法在Ramda中使用flatten函数的this React example。
import { flatten } from 'ramda';
const users = ['Steve Jobs', ['Steve Wozniak']];
const flatUsers = flatten(users);
// returns ['Steve Jobs', 'Steve Wozniak']
我假设你正在尝试做一些像在不可变集上做一个lodash地图的事情。当您尝试直接执行此操作时,Lodash不会做有用的事情。
请注意,immutable.js已经有很多自己的操作函数(比如map
)以及它自己的lazy chaining(通过Seq
)所以你应该研究那些。
如果你需要做一些lodash
提供的东西而且immutable.js
没有,你可以做的一件事就是把你的不可变对象转换成一个香草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)
你当然必须在这里考虑性能,因为如果你通过将数据复制到一个普通的数据结构中从一个转换到另一个,你最终可能会遇到最糟糕的两个世界。例如,在上面的玩具箱中,你最好直接使用immutable.js map()
。
seamless-immutable旨在提供一个向后兼容vanilla JS数据结构的API。
这允许您使用lodash方法。然而,由于许多lodash的方法都是在考虑可变性的情况下编写的,因此它们可能远非最佳。
您可能想要查看由我创建的https://github.com/engineforce/ImmutableAssign,它是一个轻量级不可变助手,它支持不变性并允许您继续使用POJO(Plain Old JavaScript Object)。因此,您可以使用任何lodash函数。
EG,
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
如何在ImmutableJS中使用withMutations?
搜索Batching Mutations
以获得简要说明here。