如何在JavaScript ES6中将地图作为对象获取?

17

我的班级正在使用es6在节点级别创建一个map对象,使用Map()中的“set”函数。当调用类时,我希望将map对象转换为普通的json类型结构。我正在使用moongoose从数据库检索数据。

res.json(MapObject);

使用此代码后,父节点中的整个内容都变为空了。

{success:{},
 error:{},
redirectMe:false}

有这样的地图对象

{
  success: 
   Map {
     'String1' => 'true',
     'Object1' => [ [Object],
                    [Object],
                    [Object],
                    [Object],
                    [Object]
                  ]
     'String2' => 100 
     }
  error: Map {},
  redirectMe: false 
}

我想将结果作为一个对象获取,但是当我尝试获取时,无法得到任何东西。

希望得到类似下面的内容:

{
  success: 
    {
     'String1' : 'true',
     'Object1' : [ [Object],
                    [Object],
                    [Object],
                    [Object],
                    [Object]
                  ]
     'String2' : 100 
     }
  error: {},
  redirectMe: false 
}

什么是问题? - Weedoze
“...转换为普通的JSON类型结构...” JSON是一种用于数据交换的文本符号。 (更多信息)。如果您正在处理JavaScript源代码,并且不涉及字符串,则您不涉及JSON。您是否指的是一个普通对象?{}? - T.J. Crowder
5个回答

21

你可以使用一个原生的JS函数很容易地将一个Map转换成对象:

Object.fromEntries(map);

注意: 此函数是ECMAScript 10规范的一部分,支持 Node.js 12+和Chrome 73+,也可以使用此插件在较旧的平台上进行填充。

const map = new Map();
// Setting up some sample data
map.set("foo", "bar");
map.set("pets", ["Fido", "Foobar", "Al"]);
// Convert map to object
const convertedMap = Object.fromEntries(map);

console.log(convertedMap);


13

现在JavaScript有了Object.fromEntries(在ES2019中添加,可以轻松地进行polyfill),这是一个一行代码的操作:

const obj = Object.fromEntries(map);

实例演示:

const map = new Map();
map.set("string1", true);
map.set("someArray", [{a:1}, {b:2}, {c:3}]);
map.set("string2", 100);

const obj = Object.fromEntries(map);

console.log(obj);
.as-console-wrapper {
  max-height: 100% !important;
}

Map 的键必须是字符串或符号,或者可以有意义地转换为字符串的东西,因为对象中的属性键只能是字符串或符号。


之前的回答:如果您有一个Map并且想将其转换为普通对象,那么如果Map的键是字符串或符号或某些东西(例如数字)可以有意义地转换为字符串,那么这很容易做到。

您只需循环其键:

const obj = {};
for (const key of map.keys()) {
  obj[key] = map.get(key);
}

现场示例:

const map = new Map();
map.set("string1", true);
map.set("someArray", [{a:1}, {b:2}, {c:3}]);
map.set("string2", 100);

const obj = {};
for (const key of map.keys()) {
  obj[key] = map.get(key);
}

console.log(obj);
.as-console-wrapper {
  max-height: 100% !important;
}

话虽如此,正如Kunal指出的,使用 entries 更有意义(而且您不需要使用 .entries(),可以直接使用 map 的 of 迭代器 来获取默认迭代器,即用于 entries 的迭代器)。


这正是我一直在寻找的。谢谢! - jwehrle
@jwehrle - :-) 自原始答案发布以来,事情已经有所进展;我已经更新了它,展示了在ES2019中添加的Object.fromEntries - T.J. Crowder
由于某些原因,我无法弄清楚在这种情况下为什么Object.fromEntries会抛出类型错误。所以我选择了一种更基本的方法。 - jwehrle
@jwehrle - 哦,好吧。无论如何都可以。 :-) 但是如果你想知道为什么,请发布一个带有你的代码的问题并指向我。(或者当然,其他人可能会先到达那里)。编码愉快! - T.J. Crowder

4

将Map转换为普通对象的单行代码:

Object.assign({}, ...[...m.entries()].map(([k, v]) => ({[k]: v})))

2
更好的将Map转换为对象的方法
let jsonResponse = {};
            for(let [key,val] of MapObject.entries()){
                jsonResponse[key]= val;
            }

console.log(jsonResponse);

-6

尝试这个非常简单的方法,可能会轻松解决您的问题。

resp.send(JSON.stringify(MapObject));


2
不仅JSON与问题无关,而且该解决方案不起作用。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接