出于某种原因,我在MDN文档中找不到这个简单的东西(也许我只是错过了它)。

我希望这能起作用:

const map = new Map({foo: 'bar'});

map.get('foo'); // 'bar'

...但是第一行会抛出TypeError:(var)[符号。Iterator]不是一个函数

我如何从一个普通的对象做一个地图?我真的要先把它转换成键值对的数组吗?


当前回答

const myMap = new Map(
    Object
        .keys(myObj)
        .map(
            key => [key, myObj[key]]
        )
)

其他回答

是的,Map构造函数接受一个键值对数组。

对象。entries是ES2017(19.1.2.5)中新增的对象静态方法。

const map = new Map(Object.entries({foo: 'bar'}));

map.get('foo'); // 'bar'

它目前在Firefox 46+和Edge 14+以及更新版本的Chrome中实现

如果你需要支持旧的环境,而编译对你来说不是一个选择,使用polyfill,比如georg推荐的:

Object.entries = typeof Object.entries === 'function' ? Object.entries : obj => Object.keys(obj).map(k => [k, obj[k]]);

我真的要先把它转换成键值对的数组吗?

不,键值对数组的迭代器就足够了。您可以使用以下方法来避免创建中间数组:

function* entries(obj) {
    for (let key in obj)
        yield [key, obj[key]];
}

const map = new Map(entries({foo: 'bar'}));
map.get('foo'); // 'bar'

Nils的答案描述了如何将对象转换为映射,我发现这非常有用。然而,OP也想知道这些信息在MDN文档的哪里。当最初提出问题时,它可能不存在,现在它在MDN页面的Object.entries()标题下的Object.entries(),其中声明:

将对象转换为映射 新的Map()构造函数接受一个包含条目的可迭代对象。与对象。条目,您可以轻松地从对象转换为映射: Const obj = {foo: 'bar', baz: 42}; const map = new map (Object.entries(obj)); console.log(地图);//映射{foo: "bar", baz: 42}

const myMap = new Map(
    Object
        .keys(myObj)
        .map(
            key => [key, myObj[key]]
        )
)

ES6

将对象转换为映射:

const objToMap = (o) => new Map(Object.entries(o));

将map转换为对象:

const mapToObj = (m) => [...m].reduce( (o,v)=>{ o[v[0]] = v[1]; return o; },{} )

注意:mapToObj函数假设map键是字符串(否则将失败)