如何将任意深度嵌套对象转换为结构一致的嵌套Map?
解决嵌套对象转嵌套Map的条目过多问题
你的代码出现条目过多的核心原因是:递归处理嵌套对象时,复用了同一个Map实例(把外层的m传给了递归调用),导致所有层级的键都被塞进了同一个Map里,最终结构混乱。
修正后的代码
const exampleInput = { a: 1, b: { c: 2, d: { e: 3 } } }; const expectedOutput = new Map([['a', 1], ['b', new Map([['c', 2], ['d', new Map([['e', 3]])]])]]); const nestedObj2Map = (o) => { const map = new Map(); for (const [k, v] of Object.entries(o)) { // 仅处理非数组的普通对象,若需处理数组可单独调整逻辑 if (typeof v === 'object' && v !== null && !Array.isArray(v)) { map.set(k, nestedObj2Map(v)); } else { map.set(k, v); } } return map; }; const result = nestedObj2Map(exampleInput); console.log(result); // 结构与expectedOutput完全一致
关键修正点
- 移除了默认参数
m = new Map(),改为每次处理对象时创建新的Map实例,确保每个层级的Map相互独立。 - 递归调用时不再传递外层Map,直接让子层级生成自己的嵌套Map,避免键的混杂。
- 增加
!Array.isArray(v)判断(可选):如果你的场景不需要把数组转成Map,这个判断可以避免将数组误识别为普通对象处理;若需支持数组转Map,可移除该判断或单独编写数组处理逻辑。
运行修正后的代码,返回的Map结构会和预期完全匹配,每个嵌套层级都是独立的Map实例,不会出现多余条目。
内容的提问来源于stack exchange,提问作者user2309803
相关产品推荐
相关产品推荐

