出于某种原因,我在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]不是一个函数
我如何从一个普通的对象做一个地图?我真的要先把它转换成键值对的数组吗?
当前回答
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键是字符串(否则将失败)
其他回答
我真的要先把它转换成键值对的数组吗?
不,键值对数组的迭代器就足够了。您可以使用以下方法来避免创建中间数组:
function* entries(obj) {
for (let key in obj)
yield [key, obj[key]];
}
const map = new Map(entries({foo: 'bar'}));
map.get('foo'); // 'bar'
const myMap = new Map(
Object
.keys(myObj)
.map(
key => [key, myObj[key]]
)
)
或者你也可以使用lodash toPairs方法:
const _ = require('lodash');
const map = new Map(_.toPairs({foo: 'bar'}));
是的,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]]);
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键是字符串(否则将失败)