React RTK:如何为嵌套对象内数组实体配置createEntityAdapter的selectId
问题
我的数据结构并非严格的数组,而是嵌套对象内部包含数组,具体结构如下:
{ "start": "3-1-2021", "event_log": [ { "event_id": 1, "rul": 61300, "start": "3-1-2021" }, { "event_id": 2, "rul": 61299, "start": "3-1-2021" } ] }
我希望提取event_id作为实体ID传入createEntityAdapter,尝试了以下代码但无效:
const chartAdapter = createEntityAdapter({ selectId: (data) => data.event_log.map(item => item.event_id) });
请问如何忽略start字段,从event_log中解构出event_id并正确配置到createEntityAdapter中?
解决方法
createEntityAdapter的selectId作用是指定单个实体的唯一ID字段,而非直接处理数组。你当前的核心问题是原始数据是包含数组的嵌套对象,而非实体数组本身,所以需要先提取event_log数组,再配合适配器完成配置:
正确配置适配器的
selectId
每个实体对应event_log中的单个对象,因此selectId应指向单个实体的event_id字段:const chartAdapter = createEntityAdapter({ selectId: (entity) => entity.event_id });提取实体数组并传入适配器
获取原始数据后,先解构出event_log数组,再通过适配器的setAll或addMany方法将实体数组注入状态:// 示例原始数据 const rawData = { start: "3-1-2021", event_log: [/* 你的事件日志数组 */] }; // 提取event_log中的实体数组 const entities = rawData.event_log; // 初始化状态并更新 const initialState = chartAdapter.getInitialState(); const updatedState = chartAdapter.setAll(initialState, entities);
这样就能自动忽略外层的start字段,将event_log内的每个对象作为独立实体,以event_id作为唯一标识进行状态管理。
内容的提问来源于stack exchange,提问作者David Ho
相关产品推荐
相关产品推荐

