如何将迭代器(FormData)转换为对象

bod*_*ser 1 javascript iterator ecmascript-6

给定一个form元素new FormData(form)返回一个迭代器.

// [["key1", "val1"],["key2", "val2"]]
console.log([new FormData(form)...])
Run Code Online (Sandbox Code Playgroud)

我现在想将其转换为表单的对象:

{ "key1": "val1", "key2": "val2" }
Run Code Online (Sandbox Code Playgroud)

使用ES6/7功能(由babel支持).

如果可以通过功能方法实现这些想法吗?

Pau*_* S. 7

您可以.reduce阵列使用扩散方面取得了...运营商

[...new FormData(document.querySelector('form'))].reduce((o, [k, v]) => {
    o[k] = v;
    return o;
}, {}); // Object {"key1": "val1", "key2": "val2"}
Run Code Online (Sandbox Code Playgroud)

  • @ guest271314:您在自己的答案中对`FormData`实例使用了`for of`,现在问它是否可迭代? (2认同)

Ant*_*ni4 6

您可以使用Object.fromEntries(iterable);

来自文档

参数:

iterable- 一个可迭代对象,例如 Array 或 Map 或其他实现可迭代协议的对象。

返回值:

一个新对象,其属性由可迭代项给出。

描述:

Object.fromEntries()方法采用键值对列表并返回一个新对象,其属性由这些条目给出。iterable 参数应该是一个实现@@iterator方法的对象,该方法返回一个迭代器对象,该对象生成一个双元素数组状对象,其第一个元素是将用作属性键的值,其第二个元素是与该属性键关联的值。

const formData = new FormData();

formData.append("a", 111);
formData.append("b", 222);
formData.append("c", 333);

console.log(Object.fromEntries(formData))
Run Code Online (Sandbox Code Playgroud)