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

POST表单提交平级数据如何自动映射匹配原有嵌套对象结构

解决方案

你可以通过以下两种常用方案实现自动映射,不需要手动逐个赋值:

方案1:修改前端表单name属性(优先推荐)

绝大多数服务端的请求体解析中间件都原生支持[]格式的嵌套字段命名规则,你只需要调整Pug模板里输入框的name属性,提交后后端可以直接得到符合要求的嵌套结构,不需要额外做转换:
修改后的Pug代码:

form(action="/foo",method="POST")
    p Foo:
        input(type="text", name="foo1", value="value2")
    table
        tbody
             tr
                  td
                       input(type="text", name="values[foo2]", value="value2")
                  td
                       input(type="text", name="values[foo3]", value="value2")
    input(type="submit",value="Submit")

提交后直接就能拿到结构:

{
   "foo1":"value2",
   "values": {
       "foo2":"value2",
       "foo3":"value2"
   }
}

方案2:后端平级数据自动转换

如果你无法修改前端表单代码,可以提前定义字段映射规则,写一个通用转换函数实现自动映射:

步骤1:定义字段与嵌套路径的映射关系

// 键为平级数据的字段名,值为对应嵌套对象的路径
const fieldMapping = {
  foo1: 'foo1',
  foo2: 'values.foo2',
  foo3: 'values.foo3'
}

步骤2:写通用转换函数(原生JS实现,无需依赖)

function mapToNested(flatData, mapping, defaultNested = {}) {
  const result = JSON.parse(JSON.stringify(defaultNested)) // 保留原始嵌套结构的默认值
  Object.keys(flatData).forEach(key => {
    if (!mapping[key]) return
    const path = mapping[key].split('.')
    let current = result
    for (let i = 0; i < path.length - 1; i++) {
      if (!current[path[i]]) current[path[i]] = {}
      current = current[path[i]]
    }
    current[path[path.length - 1]] = flatData[key]
  })
  return result
}

调用示例

// 原始嵌套对象的默认结构
const originalSchema = {
  "foo1":"value",
  "values": {
      "foo2":"value",
      "foo3":"value"
  }
}
// 提交拿到的平级数据
const flatData = {
  "foo1":"value2",
  "foo2":"value2",
  "foo3":"value2"
}

const nestedData = mapToNested(flatData, fieldMapping, originalSchema)
// 输出结果就是你需要的嵌套结构

如果你项目里已经引入了lodash,可以用_.set方法简化转换函数的代码。

内容的提问来源于stack exchange,提问作者decduck3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:27:00