Normalizr处理数组套数组:键盘配置数据归一化实现求助
解决normalizr键盘配置归一化问题
我明白你现在遇到的问题了——你的normalizr配置没正确把行里的按键映射成引用ID,反而直接把原始按键数组存进了行实体里。问题出在行实体的结构定义和原始数据不匹配:原始的row是按键对象的数组,但你给rowSchema定义的是{ keys: [keySchema] },可原始数据里根本没有keys这个属性,normalizr自然没法解析出正确的引用关系。
核心修复思路
我们需要让rowSchema能适配原始的数组格式数据,这里可以用processStrategy把原始的行数组转换成normalizr能识别的对象结构(带keys属性),同时保留行实体的ID生成逻辑。
修改后的完整代码
import { normalize, schema } from 'normalizr' // 定义按键实体,ID生成逻辑不变 const keySchema = new schema.Entity('keys', {}, { idAttribute: (key) => `k${key.label}${key.location || 0}` }) // 定义行实体:先把原始行数组转成带keys属性的对象,再解析 const rowSchema = new schema.Entity('rows', { keys: [keySchema] // 现在这个结构和转换后的对象匹配 }, { // 用行在数组中的索引作为行ID,替代原来的rowI++方式(更简洁可靠) idAttribute: (_, __, index) => index, // 关键:把输入的行数组转换成{ keys: 行数组 }的对象 processStrategy: (rowArray) => ({ keys: rowArray }) }) // 顶层schema不变 const keyboardSchema = { rows: [rowSchema] } // 假设keyboardData是你的原始键盘配置JSON export default normalize(keyboardData, keyboardSchema)
验证结果
运行这段代码后,你会得到完全符合预期的归一化结构:
entities.keys里会包含所有按键实体,ID如k~0、k10、ktab0等entities.rows里的每个行实体(ID为0、1...)会有keys属性,值是对应按键ID的数组,比如['k~0', 'k10', ...]result.rows会是行ID的数组[0, 1, ...]
这样就完美实现了你想要的归一化效果啦!
内容的提问来源于stack exchange,提问作者publicJorn
相关产品推荐
相关产品推荐

