javascript - JavaScript 将嵌套 Map 转换为对象
问题描述
我想将 es6 嵌套 Map 转换为对象。
我试过这段代码:
mapToObjectRec(m) {
let lo = {}
for(let[k,v] of m) {
if(v instanceof Map) {
lo[k] = this.mapToObjectRec(v)
}
else {
lo[k] = v
}
}
return lo
}
我想做与此功能相反的操作:
export declare type IElementsMap = Map<string, IElements>;
deserializeElements(json: any): IElementsMaps | any {
const elementsMap = new Map<string, IElementsMap>();
if (Array.isArray(json)) {
json.forEach(outer => {
const elementMap = new Map<string, IElements>();
outer[1].forEach(inner => {
elementMap.set(inner[0], inner[1]);
});
elementsMap.set(outer[0], elementMap);
});
return elementsMap;
}
return json;
}
我想在有效负载请求(发布请求)中发送转换后的数据。
解决方案
如果 Map 的键是数字、字符串或符号,则以下技术将起作用 -
const m =
new Map
( [ [ 'a', 1 ]
, [ 'b', 2 ]
, [ 'c'
, new Map
( [ [ 'd', 3 ]
, [ 'e', 4 ]
, [ 'f'
, new Map ([[ 'g', 6 ]])
]
]
)
]
]
)
const toObject = (map = new Map) =>
Object.fromEntries
( Array.from
( map.entries()
, ([ k, v ]) =>
v instanceof Map
? [ k, toObject (v) ]
: [ k, v ]
)
)
console .log (toObject (m))
// { a: 1
// , b: 2
// , c:
// { d: 3
// , e: 4
// , f: { g: 6 }
// }
// }
否则,如果 Map 键是复杂对象并且不能可靠地强制转换为字符串,则您必须提出另一个保留键的实际值的映射,例如 -
const m =
new Map
( [ [ 'a', 1 ]
, [ 'b', 2 ]
, [ 'c'
, new Map
( [ [ 'd', 3 ]
, [ 'e', 4 ]
, [ 'f'
, new Map ([[ 'g', 6 ]])
]
]
)
]
]
)
const toObject = (map = new Map) =>
Array.from
( map.entries()
, ([ k, v ]) =>
v instanceof Map
? { key: k, value: toObject (v) }
: { key: k, value: v }
)
console .log (toObject (m))
// [ { key: "a", value: 1 }
// , { key: "b", value: 2 }
// , { key: "c"
// , value:
// [ { key: "d", value: 3 }
// , { key: "e", value: 4 }
// , { key: "f", value: [ { key: "g", value: 6 } ] }
// ]
// }
// ]
推荐阅读
- python - Python在脚本出现异常时发送邮件
- python - github工作流程中的pytest超时
- javascript - 使用 JS 在媒体查询中仅重新加载网页一次
- html - 动态填充的 iframe 的错误行为
- java - 在 Wicket 中使用 markupId 作为参数在 renderHead 中运行 javascript
- next.js - Next.js 404 问题
- python - 如何使用 Python 将 excel 文件从 Google 云存储读取到 Jupyter notebook/Jupyter 实验室
- annotations - @IpsEnumId 被 IPS-Generator 删除,即使我用 @customziedAnnotations ADDED 注释了方法
- azure - 无法使用 SSH 配置部署 Azure VM
- webdriver - 如何在机器人框架中向 chrome webdriver 添加新的请求标头