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

动态解析JSON键值:DevExtreme DataGrid更新数据格式转换需求

你现有代码的核心问题有两个:

  1. 循环中硬编码取Object.values(changes)的固定索引值,没有和当前遍历的字段对应,不管循环到哪个字段都取前两个变更值,逻辑完全不匹配动态字段的场景。
  2. 缺少旧值的获取逻辑,且你原代码中定义的是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:30:00