首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以所需格式响应类型记录解析formData

以所需格式响应类型记录解析formData
EN

Stack Overflow用户
提问于 2022-11-25 17:01:55
回答 1查看 36关注 0票数 1

我是新的反应和类型记录,我有一个可编辑的表与下面的默认值,可以更新(编辑)和提交。

这是原始和预期的数据格式(参数),参数字段和值被绑定到充当ID的paramOrder。

代码语言:javascript
复制
const parameters = {
paramList: [
      {
        paramOrder: 0,
        paramInput: {
          param: [
            {
              field: "PRODUCT_TYPE",
              value: '"BT"'
            },
          ]
        },
        paramOutput: {
          param: [
            {
              field: "INCREMENTAL_EXPENSES",
              value: "0.0028"
            },
          ]
        },
        status: "Draft"
      },
      {
        paramOrder: 1,
        paramInput: {
          param: [
            {
              field: "PRODUCT_TYPE",
              value: '"BT"'
            },
          ]
        },
        paramOutput: {
          param: [
            {
              field: "INCREMENTAL_EXPENSES",
              value: "0.0028"
            },
          ]
        },
        status: "Draft"
      },
    ]
  };

我使用表单控件来处理字段更改,并将字段名称(类似于"0|PRODUCT_TYPE“:"ABC")组合在一起,然后将它们拆分为一个对象数组。

代码语言:javascript
复制
const setParam = (formData, parameters) => {
const objArray = Object.keys(formData).map(key => {
  const [paramOrder, field] = key.split('|');
  return {
   paramOrder,
   field,
   value: formData[key],
   };
 });
return objArray;
};

这是我在使用前面的代码处理更改后获得的当前格式,但是paramOrder是重复的,需要合并为一个,并且必须像上面的格式一样添加字段和值作为它的对象。

代码语言:javascript
复制
[
    {
        "paramOrder": "0",
        "field": "PRODUCT_TYPE",
        "value": "ABC",
    },
    {
        "paramOrder": "0",
        "field": "INCREMENTAL_EXPENSES",
        "value": "12",
    },
    {
        "paramOrder": "1",
        "field": "PRODUCT_TYPE",
        "value": "BT",
    },
    {
        "paramOrder": "1",
        "field": "INCREMENTAL_EXPENSES",
        "value": "0.5",
    },
]

我希望将上述更新后的值映射到原始数据格式,并仅将基于paramOrder的值和相应的值映射到给定的字段(即PRODUCT_TYPE等)。

这是代码箱链接- https://codesandbox.io/s/react-typescript-forked-qrx380?file=/src/ParameterTable.tsx

如果您需要更多的信息,请告诉我,谢谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-26 10:38:10

我定义了一些类型:

代码语言:javascript
复制
interface Param {
  paramOrder: number;
  paramInput: {
    param: { field: string; value: string }[];
  };
  paramOutput: {
    param: { field: string; value: string }[];
  };
  status: string;
}

type Params = { paramList: Param[] };

下面是代码:

代码语言:javascript
复制
const updateParams = (
  data: Record<string, string>, // formData
  params: Params // old parameters
) => Object.entries(data).reduce(updateField, params);

// this function updates one field and returns new Params object
function updateField(
  { paramList }: Params,
  [key, newValue]: [string, string]
): Params {
  const [paramOrder, fieldToUpdate] = key.split("|");
  return {
    paramList: [ // here we define new paramList
      ...paramList.map((param) =>
        // if param.paramOrder matches paramOrder of the field we
        // want to update, return new Param with updated field,
        // otherwise return old Param
        param.paramOrder === parseInt(paramOrder)
          ? {
              paramOrder: param.paramOrder,
              paramInput: {
                param: param.paramInput.param.map(({ field, value }) =>
                  field === fieldToUpdate
                    ? { field, value: newValue }
                    : { field, value }
                )
              },
              paramOutput: {
                param: param.paramOutput.param.map(({ field, value }) =>
                  field === fieldToUpdate
                    ? { field, value: newValue }
                    : { field, value }
                )
              },
              status: param.status
            }
          : param
      )
    ]
  };
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74575928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档