У меня есть 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);
}
Пункт 3: заполняет карту
// ключ карты представляет собой объединение различных атрибутов веб-страницы, разделенных |
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
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 печатается на консоли)
{
"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]"
}
}
}
^^ Поскольку карта имеет массив объектов для этого ключа, поэтому я хочу иметь массив объектов в jsonObject.
Может ли кто-нибудь помочь мне с настройкой, которую необходимо выполнить в обходе map в Пункт 4 для получения ожидаемого результата?
@Ry- Да. Это массив. извините за ошибку в заголовке.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы используете такие методы, как .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.info(JSON.stringify(jsonObject));Спасибо большое. Я очень новичок в JavaScript. начал учиться на прошлой неделе. Так что я очень мало знаю о JS и его встроенных функциях.
Под
Listвы имеете в видуArray?