You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除Reducer中的JSON.parse与JSON.stringify方法

优化方案:移除JSON.parse和JSON.stringify的深拷贝

当然可以优化,你当前用JSON序列化/反序列化做深拷贝,主要是为了遵守状态管理的immutable规则,但这种方式不仅性能开销大,还会丢失Date类型的原始引用(JSON会把Date转成字符串,反序列化后无法还原成Date对象)。下面是优化后的代码:

on(MatchActions.AddMessage, (state: MatchState, payload: { message: Message }) => {
    // 浅拷贝顶层的消息字典对象,避免直接修改原state
    const messages: MessageDictionary = { ...state.chat.messages };
    const dateKeys = Object.keys(messages);

    if (dateKeys.length > 0) {
        const latestDateKey = dateKeys[dateKeys.length - 1];
        // 对要修改的消息数组做拷贝,再添加新消息,保证immutable
        messages[latestDateKey] = [...messages[latestDateKey], payload.message];
    } else {
        messages[getNowUtc().toString()] = [payload.message];
    }

    return {
        ...state,
        chat: {
            ...state.chat,
            messages
        }
    };
}),

关键优化点说明

  • 替换深拷贝方式:用对象展开语法{...state.chat.messages}替代JSON方法,只浅拷贝顶层字典对象,性能更优。
  • 数组的immutable处理:当需要给已有日期的消息列表添加新消息时,用数组展开语法[...原数组, 新消息]创建新数组,而不是直接修改原数组的引用,确保原state不会被意外修改。
  • 保留Date类型:避免了JSON序列化导致的Date对象转字符串问题,message.messageSendUtc会保持原始的Date类型。

内容的提问来源于stack exchange,提问作者Ivo Oostwegel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:15:30