javascript - 转换多值 Map在 javascript 中转换为 json
问题描述
我有一个Map<String, List<Object>>
,我想将其转换为JSON
.
这是我所拥有的:
第 1 点:声明变量
var map = new Map(), //map
jsonObject= {}, // oject that needs to be converted to JSON
value1 = { topic: "someText1", status: "0", action: "1", comment: "someComment1" }, // values of Map
value2 = { topic: "someText2", status: "0", action: "0", comment: "someComment2" },
value3 = { topic: "someText3", status: "1", action: "1", comment: "someComment3" };
第 2 点:填充多值映射的函数
function populateMap(map, k, v) {
map[k] = map[k] || [];
map[k].push(v);
}
Point 3: populating Map
// map的key是web页面中各种属性的拼接,用|分隔
populateMap(map, 'release|attachment|license1', value1);
populateMap(map, 'release|attachment|license1', value2);
populateMap(map, 'release1|attachment1|license1', value1);
populateMap(map, 'release1|attachment1|license2', value2);
populateMap(map, 'release1|attachment1|license3', value3);
populateMap(map, 'release2|attachment2|license2', value1);
populateMap(map, 'release2|attachment2|license2', value2);
第 4 点:迭代 map 并填充 jsonObject
for (var i in map) {
var keys = i.split('|'), // splitting keys based on |
last = keys.pop(),
values = map[i];
values.forEach(function (item, index) {
keys.reduce((r, a) => r[a] = r[a] || {}, jsonObject)[last] = item;
});
}
Point 5:当前输出(控制台打印的jsonObject)
{
"release": {
"attachment": {
"license1": "[Object]"
}
},
"release1": {
"attachment1": {
"license1": "[Object]",
"license2": "[Object]",
"license3": "[Object]"
}
},
"release2": {
"attachment2": {
"license2": "[Object]"
}
}
}
第6点:预期输出(jsonObject)
{
"release": {
"attachment": {
"license1": "[Object, Object]" // expecting array of objects here ^^
}
},
"release1": {
"attachment1": {
"license1": "[Object]",
"license2": "[Object]",
"license3": "[Object]"
}
},
"release2": {
"attachment2": {
"license2": "[Object, Object]"
}
}
}
^^ 由于 map 有该键的对象数组,所以我想在jsonObject
.
有人可以帮助我在第 4 点map
的遍历中进行调整以获得预期的结果吗?
解决方案
您使用 、 、 和 等方法.set
与.get
;.has
进行交互.delete
。Map
将其元素设置为属性是不正确的。
function populateMap(map, k, v) {
let values = map.get(k);
if (values === undefined) {
map.set(k, values = []);
}
values.push(v);
}
然后遍历地图如下所示:
const jsonObject = {};
for (const [key, values] of map) {
setPath(jsonObject, key.split('|'), values);
}
并且您的setPath
实现几乎保持不变:
function setPath(obj, [...keys], item) {
const last = keys.pop();
keys.reduce((r, a) => r[a] = r[a] || {}, obj)[last] = item;
}
总而言之:
function populateMap(map, k, v) {
let values = map.get(k);
if (values === undefined) {
map.set(k, values = []);
}
values.push(v);
}
function setPath(obj, [...keys], item) {
const last = keys.pop();
keys.reduce((r, a) => r[a] = r[a] || {}, obj)[last] = item;
}
const map = new Map();
populateMap(map, 'release|attachment|license1', 'value1');
populateMap(map, 'release|attachment|license1', 'value2');
populateMap(map, 'release1|attachment1|license1', 'value1');
populateMap(map, 'release1|attachment1|license2', 'value2');
populateMap(map, 'release1|attachment1|license3', 'value3');
populateMap(map, 'release2|attachment2|license2', 'value1');
populateMap(map, 'release2|attachment2|license2', 'value2');
const jsonObject = {};
for (const [key, values] of map) {
setPath(jsonObject, key.split('|'), values);
}
console.log(JSON.stringify(jsonObject));
推荐阅读
- android - 当我尝试打开特定文件夹时,只打开最近的文件夹
- python - 如何将开始日期和结束日期之间的所有工作日加载到数据框?
- spring - 无法创建 [com.ibm.mq.jms.MQQueueConnectionFactory] 类型的内部 bean 'com.ibm.mq.jms.MQQueueConnectionFactory#61f90a1c'
- java - 消费来自 Kafka 主题的 START 消息,寻找具有相同 UID 的 END 消息;如果 END 消息在 24 小时内未读取,则记录错误
- php - 未找到 Drupal 7 站点 URL
- reactjs - 销毁array.map() 中的对象属性并将对象保留为参数
- charts - _ScaffoldLayout 自定义多子布局委托忘记布局以下子级
- python - 如何解决这个带有 pip 错误的橙色安装?
- postgresql - 无法将 JSON 从 PostgreSQL 插入到 elasticsearch。出现错误 - “执行 JDBC 查询时出现异常”
- python - 期待 FloatTensors 但在类似 MNIST 的任务中得到 LongTensors