JavaScript:如何将嵌套数组转换为动态键值对对象列表?
解决嵌套数组转动态键值对对象列表的问题
你的代码其实已经接近正确了!问题出在reduce没有传入初始空对象作为累加器的起始值,这会导致reduce默认把数组的第一个元素当作初始累加器——虽然在部分场景下能运行,但很容易出现意外行为,比如你遇到的“仅序列化第一个条目”的情况,甚至在空数组时直接抛出错误。
修复后的代码(带初始值的reduce写法)
const serializedData = data.map(entry => { // 给reduce传入初始空对象{},确保每次从干净的对象开始合并键值对 return entry.reduce((obj, item) => { obj[item.key] = item.value; return obj; }, {}); });
更简洁的ES6+写法(用Object.fromEntries)
如果你的环境支持ES2019及以上,推荐用Object.fromEntries来简化代码,逻辑更直观:
const serializedData = data.map(entry => Object.fromEntries(entry.map(item => [item.key, item.value])) );
工作原理说明
针对你给出的输入结构[[{key: k1, value: v1}, {key: k2, value: v2}], [{key: k3, value: v3}, ...]]:
- 外层
map遍历数组中的每一个子数组(也就是每个entry) - 对每个
entry:- 第一种写法:用
reduce从空对象开始,逐个将item.key和item.value添加到对象中 - 第二种写法:先把每个
{key, value}对象转成[key, value]格式的数组,再通过Object.fromEntries直接转换成目标对象
- 第一种写法:用
- 最终输出你需要的
[{k1: v1, k2: v2}, {k3: v3, ...}]格式的对象列表
测试示例
假设你的输入数据是:
const data = [ [{key: "name", value: "Alice"}, {key: "age", value: 30}], [{key: "name", value: "Bob"}, {key: "city", value: "New York"}] ];
运行上述代码后,serializedData会得到:
[ {name: "Alice", age: 30}, {name: "Bob", city: "New York"} ]
内容的提问来源于stack exchange,提问作者Kristoffer Tølbøll
相关产品推荐
相关产品推荐

