将es6 map的内容转换为JSON数组

时间:2017-09-18 16:33:15

标签: javascript json ecmascript-6

我有一个像这样设置的地图

const directory = new Map()
.set('John', { age:25, gender: 'M'} )
.set('Mary', { age:51, gender: 'M'} ) 
.set('Sam', { age:15, gender: 'M', id: 322 } )
.set('Jane', { age:15, gender: 'M', paid: true } );

我希望将其转换为带有新属性的jsons数组" name"对于地图中的每个键:

[
  { "name": "John", "age":25, "gender": "M" },
  { "name": "Mary", "age":51, "gender": "F" },  
  { "name": "Sam", "age":15, "gender": "M", "id": 322 },  
  { "name": "Jane", "age":19, "gender": "F", "paid": true }
]

我尝试了JSON.stringify([...目录])和其他一些东西,但不确定将密钥作为json的一部分包含在内的任何有效方法。

2 个答案:

答案 0 :(得分:2)

由于您已经使用spread属性来构造Map,因此您只需要将该2d数组映射到对象数组,这可以通过数组解构轻松完成:

 [...directory].map(([name,obj]) => ({name,...obj}));

或没有ESnext:

[...directory].map(([name,obj]) => Object.assign({name},obj));

Try it

答案 1 :(得分:0)

您可以使用Array.from并构建想要的对象。

const directory = new Map()
        .set('John', { age: 25, gender: 'M' })
        .set('Mary', { age: 51, gender: 'M' }) 
        .set('Sam', { age: 15, gender: 'M', id: 322 })
        .set('Jane', { age: 15, gender: 'M', paid: true }),
    result = Array.from(directory, ([name, o]) => Object.assign({ name }, o));
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }