javascript - 是否有更好/更简单的方法将 html 表单序列化为对象
问题描述
我正在发送一个包含radio
和checkbox
输入的表单(因此多个元素具有相同的名称),这就是我想出的。
有没有更快/更简单的纯 JavaScript 方法将 HTMLform
转换为object
我可以使用的方法JSON.stringify
?
没有框架或库。
function serialize_form(felement) {
const names = new Set();
let values = {}
for(let i = 0; i < felement.elements.length; i++) {
if(felement[i].name && (felement.name != undefined || felement.name != "")){
names.add(felement[i].name)
}
}
for(let name of names) {
values[name] = felement[name].value;
}
console.log(names, values);
return values;
}
解决方案
FormData.keys()
您可以使用and进行一些简单的转换FormData.getAll()
document.querySelector("form").addEventListener("submit", e => {
e.preventDefault()
const fd = new FormData(e.target)
const obj = Object.fromEntries(Array.from(fd.keys(), key => {
const val = fd.getAll(key)
return [ key, val.length > 1 ? val : val.pop() ]
}))
document.querySelector("pre").innerHTML = JSON.stringify(obj, null, 2)
})
<form>
<p><input type="text" name="text" value="text value"></p>
<p>
Checkboxes:
<label>Foo <input type="checkbox" value="foo" name="checkbox"></label>
<label>Bar <input type="checkbox" value="bar" name="checkbox"></label>
<label>Baz <input type="checkbox" value="baz" name="checkbox"></label>
</p>
<p>
Select:
<select name="select" multiple>
<option>foo</option>
<option>bar</option>
<option>baz</option>
</select>
</p>
<p><button>Serialize</button></p>
</form>
<pre></pre>
请注意,这会根据进行的选择次数来更改数组和字符串之间的值。如果您想要一个更一致的 API,即使只有一个选择,也只需为每个值使用数组。
const obj = Object.fromEntries(Array.from(fd.keys(), key =>
[ key, fd.getAll(key) ]))
推荐阅读
- javascript - 打字稿使用地图或对象
- perl - 如何在 perl 中同时使用 Time::Local 和 Time::localtime
- c# - 如何从 C# 代码中将 Visual Studio 文件类型图标作为位图获取
- python - 无法将 MQTTUtils 导入 Python 项目
- c++ - 如何在 C++ 中打印原始 std::string/c 样式的字符串
- sharepoint - 在 SharePoint 工作流中的 10 月和 11 月时间范围内添加月份时,为什么添加月份计算不正确?
- php - 如何重新启动 php while 循环
- html - 加载关于:包含 URL 内容的空白页面
- c++ - 需要有关如何将我的随机数数组连接到冒泡排序的帮助
- android - 带有安卓应用程序的自签名证书