将Map转换为常规对象

时间:2018-05-18 02:28:49

标签: javascript

我需要合并一个Map实例w /一个对象。这没有用:

> map = new Map([ ['foo', 1] ])
Map { 'foo' => 1 }
> Object.assign({}, map)
{}

看起来Object.assign不喜欢地图。

将地图转换为对象有一种不错的es6方法吗?

4 个答案:

答案 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 }