如何将普通对象转换为ES6映射

How to convert a plain object into an ES6 Map?

本文关键字:转换 ES6 映射 对象      更新时间:2023-09-26

由于某种原因,我在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)中提供的一种新的对象静态方法

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

它目前在Firefox 46+和Edge 14+以及Chrome 的更新版本中实现

如果您需要支持较旧的环境,并且无法选择转换,请使用polyfill,例如georg:推荐的polyfill

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]]
        )
)

或者,您可以使用lodash-toPairs方法:

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