我需要合并一个Map实例w /一个对象。这没有用:
> map = new Map([ ['foo', 1] ])
Map { 'foo' => 1 }
> Object.assign({}, map)
{}
看起来Object.assign
不喜欢地图。
将地图转换为对象有一种不错的es6方法吗?
答案 0 :(得分:3)
您可以通过Array.from
或点差运算符将其转换为数组,然后使用现有对象作为初始值将其减少为对象。
这将优先于任何现有对象键的Map
键。
const map = new Map([ ['foo', 1] ])
const mergeSource = {foo: 3, bar: 4}
const obj = [...map].reduce((o, [k,v]) => ({...o, [k]: v}), mergeSource)
console.info(obj)

如果现有对象键应优先,则反转reduce回调表达式
(o, [k,v]) => ({[k]: v, ...o})
答案 1 :(得分:2)
令人惊讶的是,我找不到比遍历条目和构建对象更简洁的方法:
const map = new Map([ ['foo', 1], ['bar', 2] ]);
const output = {};
for (const [key, value] of map) {
output[key] = value;
}
console.log(output);
警告:这将覆盖具有相同字符串值的任何键,后者将获胜。
答案 2 :(得分:1)
没有内置方法,但您可以执行类似
的操作
let map = new Map([ ['foo', 1] ]);
let obj = { bar: 2 };
const merge = (map, obj2) => {
return Object.assign({}, obj2, ...Array.from(map).map(([k, v]) => ({[k]: v})));
}
console.log(merge(map, obj));
答案 3 :(得分:0)
遍历条目并将其添加到对象中。这假设键为字符串。如果没有,它们将自动转换为字符串
const to_obj = ( map => {
const obj = {};
map.forEach ((v,k) => { obj[k] = v });
return obj;
});
// --------------------------------------------------
// test
const m = new Map([["a", 1], ["b", 2], ["c", 3]]);
console.log ( to_obj (m) );
// { a: 1, b: 2, c: 3 }