javascript - 从 URLSearchParams 恢复数组时,Object.fromEntries 无法按预期工作?

标签 javascript arrays

简单代码:

const o = { arr: ['a', 'b'] }
const s = new URLSearchParams(o).toString();
// restore:
const r = Object.fromEntries(new URLSearchParams(s));
console.log({ r })

输出:

  r: { arr: "a,b" } // expected: r: { arr: ["a", "b"] }

如何让Object.fromEntries返回预期的数组?

最佳答案

URLSearchParams 将值强制转换为字符串。这里的值[ 'a', 'b' ]是一个数组,所以调用了数组的toString方法,就像arr.join( ','),生成字符串“a,b”

new URLSearchParams({ arr: ['a', 'b'] }).get('arr'); // "a,b"

当您初始化 USP 对象时会发生这种情况 - 它与 Object.fromEntries 无关。这两个 API 都无法自动往返此序列化值,因为它不知道您希望逗号分隔的字符串成为字符串数组。不过,您可以为这些值编写自定义反序列化逻辑。

<小时/>

搜索参数中类似数组或类似集合的值通常表示为同一键的多次出现。要像这样初始化 USP 实例,您需要传入条目而不是类似记录的对象。例如:

const usp = new URLSearchParams([ [ 'arr', 'a' ], [ 'arr', 'b' ] ]);

usp.getAll('arr'); // [ 'a', 'b' ]
usp.toString();    // arr=a&arr=b

这种“复数”值的方法有一些优点(USP API 非常适合它,并且它不涉及任何建立在真实 URL 语法和语义之上的自定义 DSL)和缺点(解释需要特定的知识 - 参数的预期“类型”不会在源中传达,因为您通常无法区分表示具有一个成员的数组的参数和一个表示奇异值的参数)。

如果您确实以这种方式处理数组,则无法直接使用 Object.fromEntries(usp) 将其转换为通用对象,但最终会始终设置 arr 到最后出现的值。但是,您可以在两者之间执行一些映射逻辑,以处理您希望解释为数组的键。

关于javascript - 从 URLSearchParams 恢复数组时,Object.fromEntries 无法按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59989601/

相关文章:

javascript - Twitter Bootstrap 中的数据切换属性

javascript 序列化 - 一个简短的库

javascript - 使用 map 将数组中的对象重新格式化为新元素数组

javascript - 无法更新 Vuex 存储和检索数组

python - 从Python文件中读取数组

javascript - 图像映射未调整大小

javascript - Rails 5 使用 turbolink 加载 JS

javascript - 在函数中调用 componentDidMount 是不好的做法吗?

arrays - 内存 malloc 在 C 中如何工作?//我的代码有什么问题?

java - 我怎样才能从它的大小找到大致的歌曲时间