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

NGRX中如何按字符串id查找对象并替换对象数组中的对应项

问题原因排查

  • Action Type重复:你当前定义的updateQueueDataItem的标识为[Queue] Update Queue Data,和负责追加数据的updateQueueData的Action Type大概率完全重复。NGRX中Action Type是全局唯一标识,重复会导致两个Action对应的Reducer回调都被触发,先执行替换逻辑,再执行追加逻辑,最终就会出现旧项被替换、同时又新增一个相同对象的问题。
  • id类型不匹配:如果传入payload的id类型和数组中已有项的id类型不一致(比如一个是数字1、一个是字符串"1"),全等判断===会返回false,不会触发替换逻辑,若同时有追加逻辑触发就会新增对象。
  • 同时触发了两个Action:检查业务代码是否同时调用了updateQueueData和updateQueueDataItem两个Action。

修复方案

1. 修正重复的Action Type

将updateQueueDataItem的Action Type改为唯一值,避免和追加逻辑的Action冲突:

export const updateQueueDataItem = createAction(
  '[Queue] Update Queue Data Item', // 修改为唯一标识
  props<{payload: IQueue}>(),
);

2. 优化Reducer逻辑(可选)

如果需要实现「id存在则替换、不存在则追加」的通用逻辑,可以把对应Reducer修改为如下形式:

on(queueActions.updateQueueDataItem, (state, action) => {
  const targetExists = state.queueData.some(item => item.id === action.payload.id);
  if (targetExists) {
    return {
      ...state,
      queueData: state.queueData.map(item => item.id === action.payload.id ? action.payload : item)
    };
  }
  return {
    ...state,
    queueData: [...state.queueData, action.payload]
  };
}),

3. 校验id类型一致性

确保传入payload的id类型和数组中存储的id类型完全一致,避免全等判断失效。

内容的提问来源于stack exchange,提问作者viktors dolzenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:09:03