Object.values / Object.entries
简介
在 Object 中,ES2017 新增了两个新的函数,分别是 Object.values
函数和 Object.entries
函数。
Object.values()
方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用 for...in
循环的顺序相同(区别在于 for-in 循环枚举原型链中的属性)。
Object.entries()
方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in
循环遍历该对象时返回的顺序一致(区别在于 for-in 循环还会枚举原型链中的属性)。
两者枚举属性的顺序与通过手动循环对象的属性值所给出的顺序相同,如果属性名为数值的属性,是按照数值大小,从小到大遍历的。
语法
Object.values()
属性值为字符串
const obj = { foo: 'bar', baz: 'test' }
Object.values(obj)
// ["bar", "test"]
属性值为数字
const obj = { 666: 'a', 2: 'b', 8: 'c' }
Object.values(obj)
// ["b", "c", "a"]
上面例子中,属性名为数值,按照数值大小遍历,因此返回的顺序是 b
、c
、a
。
只返回对象本身的可遍历属性
const obj = Object.create({}, { p: { value: 42 } })
Object.values(obj)
// []
上面代码中,Object.create
方法的第二个参数添加的对象属性 enumerable
默认是 false
,Object.values
不会返回这个属性。只要把 enumerable
改成 true
,Object.values
就会返回属性 p
的值。
const obj = Object.create(
{},
{
p: {
value: 42,
enumerable: true,
},
},
)
Object.values(obj)
// [42]
属性值为 Symbol
Object.values({ [Symbol()]: 123, foo: 'abc' })
// ['abc']
Object.values
会过滤属性名为 Symbol 值的属性。
参数不是对象
如果 Object.values
方法的参数是一个字符串,会返回各个字符组成的一个数组。
Object.values('foo')
// ['f', 'o', 'o']
如果参数不是对象,Object.values
会先将其转为对象。
由于数值和布尔值的包装对象,都不会为实例添加非继承的属性。所以,Object.values 会返回空数组。
Object.values(42) // []
Object.values(true) // []
Object.entries()
除了返回值不一样,该方法的行为与 Object.values
基本一致。
遍历对象的属性
const obj = { a: 5, b: 7, c: 9 }
for (const [key, value] of Object.entries(obj)) {
console.log(`${key}: ${value}`)
}
// "a: 5", "b: 7", "c: 9"
将 Object
转为 Map
结构
new Map()
构造函数接受一个可迭代的 entries
。借助 Object.entries
方法你可以很容易的将 Object
转换为 Map
:
var obj = { foo: 'bar', baz: 42 }
var map = new Map(Object.entries(obj))
console.log(map)
// Map { foo: "bar", baz: 42 }