ES6+ Object.entries()
前两节我们学习了可枚举对象上和值作为数组的 Object.keys()
和 Object.values()
,但是我们想把键值对同时到怎么办呢?这时 ES6 提供了 Object.entries()
用于可枚举对象上的和值的数组。
Object.entries()
会返回二维数组,数组中的每一项是可枚举对象上的和值的数组。
Object.entries(obj);
返回结果是二维数组,数组中的每个元素是包含两个元素的数组,第元素是,第二个元素是对应的值。
var obj = {a: , b: , c: };
console.log(Object.entries(obj))
// [['a', 1], ['b', 3], ['c', 3]]
如果传入的参数是数字或布尔值时,则返回空数组
Object.entries() // []
Object.entries(false) // []
对 values()
返回数组的顺序,会按照的数值大小,从小到大排序。
var obj = {: 'a', : 'b', : 'c'};
console.log(Object.entries(obj))
// [["1", "b"], ["7", "c"], ["10", "a"]]
上面的中,名为数值的,是按照数值大小,从小到大遍历的,因此返回值是排序后的二维数组。
values()
传入的对象如果是字符串时,则会把字符拆成数组中的单个项,如下:
console.log(Object.entries('abc'))
// [["0", "a"], ["1", "b"], ["2", "c"]]
Object.entries()
在开发中有很好的用途,可以同时对象的键值对进行使用。
其实像使用 Object.keys()
、 Object.values()
和 Object.entries()
都是为了遍历对象,然后对对象中的元素进行操作,下面我们来看一下 Object.entries()
在 for 循环中的使用。
var obj = { name: 'imooc', age: , lesson: 'ES6 Wiki' };
for (let i = ; i < Object.entries(obj).length; i++) {
var [key, value] = Object.entries(obj)[i]
console.log(key, value);
}
上面的中我们可以看出,在循环体内可以通过结构的方式对象的和值。使用 for 循环时我们要对循环的每一步进行处理。
在下面的章节中我们会学到 for...of
循环,它的强大,能遍历可迭代的对象,可以替代 for
、 forEach
等循环,并具有扩展性。
let obj = { name: 'imooc', age: , lesson: 'ES6 Wiki' };
for (let [key, value] of Object.entries(obj)) {
console.log(`${key}: ${value}`);
}
// name: imooc
// age: 7,
// lesson: ES6 Wiki
上面的中,我们不用在 for 循环中处理每一项,可以在循环时直接解构出 Object.entries()
的值。这样就可以遍历出对象的键值对。
Object.entries()
还有最重要的,就是可以把指定的对象直接转化成 ES6 的 Map 数据结构。
ES6 提供了新的 Map
数据结构,它类似于对象,也是键值对的集合,但是 Map
的键可以是任意类型(原始类型和对象类型),并且提供了 set
、 get
去设置和对象的值。如果想把对象转为 Map
结构,可以借助 Object.entries()
来实现。
var obj = { name: 'imooc', age: };
var map = new Map(Object.entries(obj));
console.log(map) // Map(2) {"name" => "imooc", "age" => 7}
console.log(map.get(name)) // imooc
上面的中,很好地把已有的对象,转化为 Map
对象,而且可以使用 Map
的对象上的数据。
Object.fromEntries()
是 Object.entries()
的反转,这样理解起来就比较轻松。它接收的是可迭代的对象,类似 Array
、Map
或者其它实现了可迭代协议的对象,结果返回新的对象。
将带有键值对的数组转化成对象。
var arr = [ ['a', '0'], ['b', '1'], ['c', '2'] ];
var obj = Object.fromEntries(arr);
console.log(obj); // {a: "0", b: "1", c: "2"}
上面的中,arr 是二维数组,子数组中的每项包含键和值,只有这样的数组类型才可以转化为对象。
Object.fromEntries()
可以直接将 Map
结构的对象转化为正常的对象,在开发中是非常常用的。
var map = new Map();
map.set('name', 'imooc');
map.set('age', );
console.log(map); // Map(2) {"name" => "imooc", "age" => 7}
var obj = Object.fromEntries(map);
console.log(obj); // {name: "imooc", age: 7}
上面的中,先定义 Map
数据结构,并给 map
name
和 age
两个,然后使用 Object.fromEntries()
对 map
进行操作,最后可以得到对象。
本节主要讲解了 ES6 提供了可枚举对象上的键值对的,这个在开发中很常用,主要用于 for...of
循环和 Map 数据结构的转化。另外,Object.fromEntries()
是 Object.entries()
的反转,他们的操作是相反的,主要用在对 Map 数据结构转换为普通的对象结构。