【问题标题】:convert multi-value Map<String, Object [ ]> to json in javascript在 javascript 中将多值 Map<String, Object [ ]> 转换为 json
【发布时间】:2023-04-01 06:17:01
【问题描述】:

我有一个Map&lt;String, List&lt;Object&gt;&gt;,我想将其转换为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点:填充地图
//地图的关键是网页中各种属性的串联,用|分隔/p>

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]"
    }
  }
}

^^ 由于 map 具有该键的对象数组,所以我想在 jsonObject 中拥有对象数组。

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

【问题讨论】:

  • List,你的意思是Array吗?
  • @Ry- 是的。它是数组。抱歉标题中的错误。

标签: javascript json iteration


【解决方案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.log(JSON.stringify(jsonObject));

【讨论】:

  • 非常感谢。我对 JavaScript 很陌生。上周开始学习。所以我对JS知之甚少,它是内置函数
猜你喜欢
  • 2015-01-10
  • 1970-01-01
  • 2013-05-24
  • 2014-01-29
  • 2013-06-16
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多