出于某种原因,我在MDN文档中找不到这个简单的东西(也许我只是错过了它)。
我希望这能起作用:
const map = new Map({foo: 'bar'});
map.get('foo'); // 'bar'
...但是第一行会抛出TypeError:(var)[符号。Iterator]不是一个函数
我如何从一个普通的对象做一个地图?我真的要先把它转换成键值对的数组吗?
出于某种原因,我在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键是字符串(否则将失败)