动态解析JSON键值:DevExtreme DataGrid更新数据格式转换需求
你现有代码的核心问题有两个:
- 循环中硬编码取
Object.values(changes)的固定索引值,没有和当前遍历的字段对应,不管循环到哪个字段都取前两个变更值,逻辑完全不匹配动态字段的场景。 - 缺少旧值的获取逻辑,且你原代码中定义的是
after字段,和你需求要求的new字段不一致。
DevExtreme DataGrid的行更新事件(如onRowUpdating)本身会返回修改前的整行数据oldData,你可以直接从这个对象中取对应字段的原值,不需要额外做复杂的存储逻辑。
完整实现代码如下:
/** * 转换DevExtreme更新数据为目标格式 * @param {Object} rawUpdateData DevExtreme生成的原始更新JSON,包含key和data字段 * @param {Object} oldRowData DevExtreme事件返回的修改前整行原始数据 * @returns {Object} 转换后的目标格式数据 */ function convertUpdateFormat(rawUpdateData, oldRowData) { const output = {}; const changedFields = rawUpdateData.data; // 遍历所有动态变更的字段 Object.keys(changedFields).forEach(fieldName => { output[fieldName] = { before: oldRowData[fieldName] ?? '', // 原值不存在时默认返回空字符串,可按需调整默认值 new: changedFields[fieldName] } }); return output; } // 调用示例 const rawData = {"key": "2021-01-01 22:59:59", "data": {"field1": "newvalue1", "field2": "newvalue2"}}; // oldRowData来自DevExtreme更新事件返回值,示例值如下 const oldData = {"field1": "oldValue1", "field2": "oldValue2", "otherUnchangedField": "xxx"}; const result = convertUpdateFormat(rawData, oldData); console.log(JSON.stringify(result, null, 2));
上述代码输出结果和你要求的格式完全一致:
{ "field1": { "before": "oldValue1", "new": "newvalue1" }, "field2": { "before": "oldValue2", "new": "newvalue2" } }
如果你当前场景无法直接获取DevExtreme返回的oldData,只需要提前按照key字段缓存所有行的原始数据,转换时用rawUpdateData.key从缓存中取出对应行的旧值即可。
内容的提问来源于stack exchange,提问作者SoftwareDveloper
相关产品推荐
相关产品推荐

