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

我希望这能起作用:

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

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

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

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


当前回答

或者你也可以使用lodash toPairs方法:

const _ = require('lodash');
const map = new Map(_.toPairs({foo: 'bar'}));

其他回答

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

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

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

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

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键是字符串(否则将失败)

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

或者你也可以使用lodash toPairs方法:

const _ = require('lodash');
const map = new Map(_.toPairs({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}