出于某种原因,我在MDN 文档中找不到这个简单的东西(也许我只是想念它)。
我希望这能奏效:
const map = new Map({foo: 'bar'});
map.get('foo'); // 'bar'
...但第一行抛出 TypeError: (var)[Symbol.iterator] is not a function
如何从普通对象制作地图?我真的必须先将其转换为键值对数组的数组吗?
出于某种原因,我在MDN 文档中找不到这个简单的东西(也许我只是想念它)。
我希望这能奏效:
const map = new Map({foo: 'bar'});
map.get('foo'); // 'bar'
...但第一行抛出 TypeError: (var)[Symbol.iterator] is not a function
如何从普通对象制作地图?我真的必须先将其转换为键值对数组的数组吗?
是的,Map
构造函数采用键值对数组。
Object.entries
是ES2017 (19.1.2.5) 中一个新的 Object 静态方法。
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 文档中的何处。虽然最初提出问题时它可能不存在,但现在它位于Object.entries()的 MDN 页面上,标题为将对象转换为映射,其中指出:
将对象转换为地图
该
new Map()
构造函数接受一个可迭代的entries
。使用Object.entries
,您可以轻松地从 转换Object
为Map
:const obj = { foo: 'bar', baz: 42 }; const map = new Map(Object.entries(obj)); console.log(map); // Map { foo: "bar", baz: 42 }
ES6
将对象转换为地图:
const objToMap = (o) => new Map(Object.entries(o));
将地图转换为对象:
const mapToObj = (m) => [...m].reduce( (o,v)=>{ o[v[0]] = v[1]; return o; },{} )
注意:mapToObj 函数假定映射键是字符串(否则会失败)
const myMap = new Map(
Object
.keys(myObj)
.map(
key => [key, myObj[key]]
)
)