Преобразовать многозначную Map<String, Object []> в json в javascript

У меня есть 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 для получения ожидаемого результата?

Под List вы имеете в виду Array?

Ry- 27.07.2019 04:26

@Ry- Да. Это массив. извините за ошибку в заголовке.

akapti 27.07.2019 04:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
862
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете такие методы, как .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 и его встроенных функциях.

akapti 27.07.2019 04:43

Другие вопросы по теме