关于Object.entries(),你还知道Object.fromEntries()吗?
前言
我们知道要把一个Object
转换成Array
,可以使用Object.entries()
。但是如果你想把一个Array
转换成Object
怎么办?我们可以使用Object.fromEntries()
,它来自ES10语法。
const keyValueArr = [
['key1', 'value1'],
['key2', 'value2'],
];
Object.fromEntries(keyValueArr); // {key1: 'value1', key2: 'value2'}
Object.fromEntries()
Object
是一个存储着键值对的一个东西,所以我们想要把某物转换成对象,就必须有key
和value
,满足这些条件的有两种:
- 能存储键值对的数组
- Map对象
用Object.fromEntries将数组转为对象
只是存有键值对的数组:
const keyValueArr = [
['key1', 'value1'],
['key2', 'value2'],
];
可以使用Object.fromEntries(),将数组转为对象:
Object.fromEntries(keyValueArr); // { key1: "value1", key2: "value2"}
用Object.fromEntries将Map转为对象
Map来自ES6语法,创建一个Map对象:
const map = new Map([
['key1', 'value1'],
['key1', 'value1'],
]);
// 或者使用Map的set方法
const map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');
// Map(2) {"key1" => "value1", "key2" => "value2"}
在使用Object.fromEntries()之前我是这样将Map转为Object的:
/**
* Map对象转Object对象
* @param map {Map}
* @returns {Object}
*/
export function mapToObject(map) {
const obj = Object.create(null)
for (const [key, value] of map) {
obj[key] = value
}
return obj
}
而使用Object.fromEntries()一切就变得非常简单:
Object.fromEntries(map); // { key1: "value1", key2: "value2"}
Object.fromEntries与其他类型的类型错误
当你尝试将其他类型传递到Object.fromEntries时,它会抛出错误:Uncaught TypeError
Type | |
---|---|
Undefined | Object.fromEntries(undefined) |
Null | Object.fromEntries(null) |
Boolean | Object.fromEntries(true) |
Number | Object.fromEntries(123) |
String | Object.fromEntries(‘123’) |
Object | Object.fromEntries({key: ‘value’}) |
Single Value Array | Object.fromEntries([1,2,3]) |
请确保传递键值对!
Object到Object的转换
通常,我们选择使用Object.entries()
时,是因为可以使用到许多Array的方法,就比如filter:
const obj = {a: 1, b: 2, c: 3};
const arr = Object.entries(obj).filter(([key, value]) => key!== 'a');
// [['b', '2'], ['c', '3']]
但完成转换之后,我看着这个数组就非常困扰,有了Object.fromEntries之后,我们既可以访问Array的方法,还能再转换回来:
const obj = {a: 1, b: 2, c: 3};
const arr = Object.fromEntries(Object.entries(obj).filter(([key, value]) => key!== 'a'));
// {b: 2, c: 3}