不可变 JS - 如何用新列表替换列表

Immutable JS - How to replace a list with a new list

我有一个使用 Immutability.js 的 React + Redux 应用程序。在我的减速器中,我将状态定义为不可变列表

const initialSuggestedResponseState = Immutable.List([]);

每次发生特定操作时,我都想用新列表替换此列表。我想我在 Immutability.js 中遗漏了一些东西,因为我无法找到可行的解决方案。到目前为止,我已经尝试过这样的事情:

        state.clear();
        action.messages.forEach(message => {
            let newResponse = new suggestedResponseRecord({
                body: message.body,
                responseId: message.response_id,
                type: message.type
            });
            state.push(newResponse);
        });
        return state;

然而,这不会将 任何东西 推到我的列表中。为什么这不起作用,合适的方法是什么?我敢肯定还有更简单的东西。

提前致谢:)

对任何类型的不可变对象执行 state.push returns 一个新对象。现有状态未被修改,这就是为什么在推送到状态后返回状态不起作用的原因。一个快速的破解方法是将 state.push(newResponse); 更改为 state = state.push(newResponse);。我建议您阅读更多有关不可变结构如何工作的内容:)

作为 zackify 回答的后续,您可以采用以下一种方法来简化代码:

return new List(action.messages.map(message => {
    return new suggestedResponseRecord({
        body: message.body,
        responseId: message.response_id,
        type: message.type
    });
});

这会根据您的消息数组创建一个记录数组(使用 Array.prototype.map),然后将该新数组转换为一个不可变列表。不确定这是否是最有效的做事方式,但它的可读性很强。