是否有任何方法将immutable.js与lodash一起使用?

12
我正在使用immutable.js来开发我的flux应用程序。它非常有用,可以提高性能。但是让我感到遗憾的是,我不能与lodash一起使用它。Lodash提供了许多有用的API函数,因此我想知道是否有办法让它们一起为我工作?

2
也许提供一些代码,说明这两个库如何无法一起使用? - Adam Boduch
我不认为它们可以一起工作,因为lodash处理JavaScript数组和对象,而immutable.js则用其自己的列表和映射替换它们。 - OlliM
您还可以查看 https://github.com/engineforce/ImmutableAssign,它支持不可变性并允许您继续使用POJO(普通旧JavaScript对象)进行工作。 - engineforce
6个回答

11

如果您想使用不可变性和无副作用函数,可以使用Ramda

该库提供了类似于lodash的有用功能,但是采用了一种永远不会改变用户数据的函数式编程风格。

考虑使用ES6语法在React中使用Ramda的flatten函数的此示例

import { flatten } from 'ramda';  

const users = ['Steve Jobs', ['Steve Wozniak']];
const flatUsers = flatten(users);

// returns ['Steve Jobs', 'Steve Wozniak']

6
我假设你正在尝试对不可变集合进行类似于 lodash map 的操作。直接这样做时,lodash 不会提供有用的帮助。
请注意,immutable.js 已经拥有了很多自己的操作函数(例如 map),以及通过 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()

6
针对我的特定情况,多次转换 JS 和转换为 JS 是不可接受的。无论如何,我发现 immutable.js 有自己的大型 API,在大多数情况下可以替代 lodash。感谢您的回答。 - Boris Zagoruiko
我可以证明,频繁使用 .fromJS() 和 .toJS() 是非常昂贵的。我建议要么假设整个状态树都封装在Immutable.js的API中,要么非常小心地将其编织进去。 - Con Antonakos

5

我最近写了一个支持Immutable.JS的Lodash包装器,叫做mudash。大多数主要的Lodash函数都支持,而且还会定期添加更多的函数。


1

无缝不可变旨在提供与原始JS数据结构向后兼容的API。

这使您可以使用lodash方法。然而,由于许多lodash方法是针对可变性编写的,因此它们可能远非最佳选择。


1

您可能想要查看由我创建的https://github.com/engineforce/ImmutableAssign,它是一个轻量级不可变助手,支持不可变性,并允许您继续使用POJO(普通旧JavaScript对象)进行工作。因此,您可以使用任何lodash函数。

E.g.,

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

在ImmutableJS中使用withMutations如何?

搜索批量变异,这里有简要说明here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接