关于Object.entries(),你还知道Object.fromEntries()吗?

less than 1 minute read

前言

我们知道要把一个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是一个存储着键值对的一个东西,所以我们想要把某物转换成对象,就必须有keyvalue,满足这些条件的有两种:

  • 能存储键值对的数组
  • 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}