如何将普通对象转换为ES6地图?

2022-08-30 00:59:21

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

我期望这能起作用:

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

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

...但第一行抛出TypeError: (var)[Symbol.iterator] is not a function

如何从普通对象制作地图?我真的必须首先将其转换为键值对数组吗?


答案 1

是的,构造函数采用键值对数组。Map

Object.entriesES2017 (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]]);

答案 2

我真的必须首先将其转换为键值对数组吗?

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

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

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