有什么方法可以将 immutable.js 与 lodash 一起使用?

Any way to use immutable.js with lodash?

我正在使用 immutable.js with my flux application. It is very useful and gives performance boost. But what actually makes me sad is the fact that I can't use lodash 和它一起使用。 Lodash 提供了很棒的 API 和大量有用的功能,所以我想知道是否有办法让它们一起为我工作?

我假设您正在尝试做一些事情,例如在不可变集上做一个 lodash 映射。当您尝试直接这样做时,Lodash 不会做有用的事情。

请注意,immutable.js 已经有很多自己的操作函数(如 map) as well as its own 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)

您当然必须在这里考虑性能,因为如果您通过将数据复制到普通数据结构来从一个世界转换到另一个世界,您可能最终会遇到两全其美的情况。例如,在上面的玩具箱中,您最好直接使用 immutable.js map()

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

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

考虑this React example使用 ES6 语法在 Ramda 中使用 flatten 函数。

import { flatten } from 'ramda';  

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

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

seamless-immutable 旨在提供一个 API 向后兼容 vanilla JS 数据结构。

这允许您使用 lodash 方法。然而,由于 lodash 的许多方法在编写时都考虑到了可变性,因此它们可能远非最佳。

您可能想看看我创建的 https://github.com/engineforce/ImmutableAssign,这是一个轻量级的不可变助手,它支持不变性并允许您继续使用 POJO(Plain Old JavaScript Object)。因此,您可以使用任何 lodash 函数。

例如,

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

我最近编写了一个 Lodash 包装器,提供 Immutable.JS 支持,称为 mudash。大多数主要的 Lodash 功能都得到支持,并且会定期添加更多功能。

如何在 ImmutableJS 中使用 withMutations

搜索 Batching Mutations 以获得简要说明 here