首页 > 网页制作 >Object.fromEntries 快速转换动态表单 FormData 为 JSON 格式

Object.fromEntries 快速转换动态表单 FormData 为 JSON 格式

来源:互联网 2026-07-30 13:43:15

Object.fromEntries 更可靠,因其原生匹配 FormData 迭代规范,不丢键、不误转类型、保留最后重复键;但多选 checkbox 需用 getAll 手动处理,File 字段经 JSON.stringify 会消失,故文件上传应直接提交 FormData。 Object.from

Object.fromEntries 更可靠,因其原生匹配 FormData 迭代规范,不丢键、不误转类型、保留最后重复键;但多选 checkbox 需用 getAll 手动处理,File 字段经 JSON.stringify 会消失,故文件上传应直接提交 FormData。

Object.fromEntries 快速转换动态表单 FormData 为 JSON 格式

Object.fromEntries 转换 FormData 为何比手动遍历更可靠

核心原因在于 FormData 的 entries() 方法原生支持键值对迭代,而 Object.fromEntries 正是为此场景设计。它不会遗漏任何键,不会将布尔值或数字误转为字符串,重复键仅保留最后一个(通常符合预期行为),且能直接处理 File 对象——当然,序列化时需另行处理。相比之下,手动使用 for...of 或 Array.from 配合 reduce 的写法,稍有不慎就会丢失 undefined 值,或将 File 当作普通字符串序列化,埋下隐患。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

Object.fromEntries 转换后,File 字段在 JSON 中会怎样

转换后 File 字段会保留为 File 实例对象,问题出现在 JSON.stringify 步骤——由于 File 不可枚举且无可序列化的自有属性,该字段在序列化时直接消失。这不是 Object.fromEntries 的缺陷,而是 JSON 序列化本身的限制:

const data = new FormData();
data.append('avatar', new File([''], 'test.jpg', {type: 'image/jpeg'}));
data.append('name', 'Alice');
const obj = Object.fromEntries(data);
console.log(obj.avatar); // File {name: "test.jpg", lastModified: ..., size: 0, type: "image/jpeg"}
console.log(JSON.stringify(obj)); // {"name":"Alice"} ← avatar 消失
  • 如需上传文件,建议直接使用 fetch(url, { method: 'POST', body: formData }) 提交,避免 JSON 路径。
  • 若 API 强制要求 JSON 格式,需提前用 FileReader 或 arrayBuffer() 将文件转为 base64 或 blob URL,再放入对象中。
  • 纯文本字段(如 input[type="text"]、select、textarea)可放心使用 fromEntries 转换,不会出现问题。

Object.fromEntries 处理多选 checkbox 的解决方案

浏览器对同名的多选 checkbox 会按顺序多次 append 值,即 FormData.entries() 返回多条相同键的条目。但 Object.fromEntries 仅保留最后一条,导致只拿到最后一个勾选项,不符合预期。

  • 正确做法:改用 FormData.getAll(key) 手动收集为数组。
  • 示例:const hobbies = formData.getAll('hobby'); → 返回 ['reading', 'swimming']。
  • 合并进对象:{ ...Object.fromEntries(formData), hobby: formData.getAll('hobby') }。
  • 注意:单选 radio 和普通 input 不受影响,仍可直接使用 fromEntries。

IE 兼容性不足时的轻量 fallback 方案

Object.fromEntries 在 IE 中完全不可用,但无需引入整个 core-js。使用一行 reduce 模拟即可:

const fromEntries = (iterable) => 
  Array.from(iterable).reduce((obj, [k, v]) => ({ ...obj, [k]: v }), {});
  • 该实现不处理 Symbol 键,性能非最优,但对表单数据足够。
  • 若项目使用 Babel,添加 @babel/preset-env 并设置 targets.ie: "11",可自动 polyfill。
  • 避免使用 Object.assign(...) 展开,以防 key 为 __proto__ 等引发原型污染。

实际开发中,最易忽略的是检查哪些字段应走 JSON、哪些应单独构造 FormData。混用两种提交方式时,字段命名冲突和类型隐式转换才是真正陷阱。提前规划边界,可节省后续大量调试时间。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备2026025700号-3 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。