转换多值Map< String,Object []>到javascript中的json [英] convert multi-value Map<String, Object [ ]> to json in javascript

查看:108
本文介绍了转换多值Map< String,Object []>到javascript中的json的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Map<String, List<Object>>,我想将其转换为JSON.

I have a Map<String, List<Object>> and i want to convert it to JSON.

这里是我所拥有的:
要点1:声明变量

Here is what I have:
Point 1: Declaring variables

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:用于填充多值地图的功能

Point 2: function to populate multi-value map

function populateMap(map, k, v) {
    map[k] = map[k] || [];
    map[k].push(v);
}

要点3:填充地图
地图的//键是网页中各种属性的连接,以 |

Point 3: populating Map
// key of map is concatenation of various attributes from web page, separated by |

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点:迭代地图并填充jsonObject

Point 4: iterating map and populating 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;
    });
}

第5点:当前输出(在控制台上打印jsonObject)

Point 5: current output (jsonObject printed on console)

{
  "release": {
    "attachment": {
      "license1": "[Object]"
    }
  },
  "release1": {
    "attachment1": {
      "license1": "[Object]",
      "license2": "[Object]",
      "license3": "[Object]"
    }
  },
  "release2": {
    "attachment2": {
      "license2": "[Object]"
    }
  }
}

第6点:预期输出(jsonObject)

Point 6: expected output (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中具有对象数组.

^^ Since map is having array of objects for that key, So i want to have array of objects in jsonObject.

有人可以帮助我进行调整吗?需要在第4点中进行map遍历才能获得预期的结果?

Can someone help me with tweak needs to be done in map traversal in Point 4 to obtain expected result?

推荐答案

您使用.set.get.has.delete之类的方法与Map进行交互;将其元素设置为属性是不正确的.

You use methods like .set, .get, .has, and .delete to interact with Map; setting its elements as properties is incorrect.

function populateMap(map, k, v) {
    let values = map.get(k);

    if (values === undefined) {
        map.set(k, values = []);
    }

    values.push(v);
}

然后遍历地图,如下所示:

Then iterating over the map looks like this:

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;
}

toto:

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));

这篇关于转换多值Map&lt; String,Object []&gt;到javascript中的json的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆