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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:26:54