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

SvelteKit Action中如何接收对象数组形式的表单数据?

如何在SvelteKit Action中将表单的数组式键名转换为嵌套对象/数组

我是SvelteKit新手,表单输入的name属性设置如下:

input 1: config[0][name]
input 2: config[0][type]
input 3: config[1][name]
input 4: config[2][type]

在SvelteKit Action中处理时,通过Object.fromEntries(await request.formData())得到的数据结构是:

{
  'config[0][name]': '',
  'config[0][type]': '',
  'config[1][name]': '',
  'config[1][type]': ''
}

只能通过formData['config[0][name]']这种方式访问,而我希望能直接用formData.config[0].name这种嵌套数组/对象的形式访问。我的Action代码如下:

const create: Action = async ({request})=> {
  const formData = Object.fromEntries(await request.formData());
  
  console.log("data", formData);
}

解决方案

你需要实现一个解析函数,将带括号的扁平键名转换为嵌套的对象/数组结构。以下是可直接使用的实现:

function parseFormDataKeys(data) {
  const result = {};
  
  for (const [key, value] of Object.entries(data)) {
    // 把"config[0][name]"转换为"config.0.name"后拆分键名数组
    const keys = key.replace(/\[(\w+)\]/g, '.$1').split('.');
    let current = result;
    
    for (let i = 0; i < keys.length; i++) {
      const k = keys[i];
      if (i === keys.length - 1) {
        // 最后一层直接赋值
        current[k] = value;
      } else {
        // 不存在则根据下一级键类型创建数组或对象
        if (!current[k]) {
          current[k] = /^\d+$/.test(keys[i+1]) ? [] : {};
        }
        current = current[k];
      }
    }
  }
  
  return result;
}

在你的Action中调用这个函数:

const create: Action = async ({request})=> {
  const rawFormData = Object.fromEntries(await request.formData());
  const formData = parseFormDataKeys(rawFormData);
  
  console.log("data", formData);
  // 现在可以直接访问 formData.config[0].name、formData.config[1].name 等
}

核心逻辑说明

  • 将带括号的键名转换为点分隔格式,例如config[0][name]处理为config.0.name
  • 拆分键名为数组后,逐层遍历构建嵌套结构
  • 检测到下一级键是纯数字时,自动创建数组;否则创建普通对象

内容的提问来源于stack exchange,提问作者Idris Akbar Adyusman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:17:23