You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}, ...]]:

  1. 外层map遍历数组中的每一个子数组(也就是每个entry)
  2. 对每个entry:
    • 第一种写法:用reduce从空对象开始,逐个将item.key和item.value添加到对象中
    • 第二种写法:先把每个{key, value}对象转成[key, value]格式的数组,再通过Object.fromEntries直接转换成目标对象
  3. 最终输出你需要的[{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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:52:48