首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不可变的JS --如何用新列表替换列表

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

Stack Overflow用户
提问于 2016-11-21 16:54:06
回答 2查看 1.1K关注 0票数 2

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

const initialSuggestedResponseState = Immutable.List([]);

每次发生特定的操作时,我都想用一个新的列表来替换这个列表。我想我错过了Immutability.js的一些东西,因为我还没有找到一个可行的解决方案。到目前为止,我已经尝试过这样的方法:

代码语言:javascript
复制
        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;

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

(预先谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-21 16:55:46

对任何类型的不可变对象执行state.push将返回一个新对象。现有的状态没有被修改,这就是为什么在推到状态后返回状态的原因。一个快速的黑客就是将state.push(newResponse);转换为state = state.push(newResponse);。我建议你多读一些关于不可变结构是如何工作的:)

票数 3
EN

Stack Overflow用户

发布于 2016-11-21 17:06:23

作为zackify答案的后续,这里有一种简化代码的方法:

代码语言:javascript
复制
return new List(action.messages.map(message => {
    return new suggestedResponseRecord({
        body: message.body,
        responseId: message.response_id,
        type: message.type
    });
});

这将从消息数组(使用Array.prototype.map)创建一个记录数组,然后将该新数组转换为不可变列表。不确定这是否是最有效的方法,但它是相当可读的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40725361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档