2021.04.28(Object.keys(),Object.values(), Object.entries()、Object.fromEntries())
Object.keys()
ES5 引入了 Object.keys 方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历
(enumerable)属性的键名。
1. var obj = { foo: 'bar', baz: 42 }; 2. Object.keys(obj) 3. // ["foo", "baz"]
ES2017 引入了跟 Object.keys 配套的 Object.values 和 Object.entries ,作为遍历一个对
象的补充手段,供 for...of 循环使用。
1. let {keys, values, entries} = Object;
2. let obj = { a: 1, b: 2, c: 3 };
3.
4. for (let key of keys(obj)) {
5. console.log(key); // 'a', 'b', 'c'
6. }
7.
8. for (let value of values(obj)) {
9. console.log(value); // 1, 2, 3
10. }
11.
12. for (let [key, value] of entries(obj)) {
13. console.log([key, value]); // ['a', 1], ['b', 2], ['c', 3]
14. }
Object.values()
Object.values 方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历
(enumerable)属性的键值。
1. const obj = { foo: 'bar', baz: 42 };
2. Object.values(obj)
3. // ["bar", 42]
返回数组的成员顺序,与本章的《属性的遍历》部分介绍的排列规则一致。
1. const obj = { 100: 'a', 2: 'b', 7: 'c' };
2. Object.values(obj)
3. // ["b", "c", "a"]
上面代码中,属性名为数值的属性,是按照数值大小,从小到大遍历的,因此返回的顺序
是 b 、 c 、 a 。
Object.values 只返回对象自身的可遍历属性。
1. const obj = Object.create({}, {p: {value: 42}});
2. Object.values(obj) // []
上面代码中, Object.create 方法的第二个参数添加的对象属性(属性 p ),如果不显式声明,
默认是不可遍历的,因为 p 的属性描述对象的 enumerable 默认
是 false , Object.values 不会返回这个属性。只要把 enumerable 改
成 true , Object.values 就会返回属性 p 的值。
Object.values 会过滤属性名为 Symbol 值的属性。
1. Object.values({ [Symbol()]: 123, foo: 'abc' });
2. // ['abc']
如果 Object.values 方法的参数是一个字符串,会返回各个字符组成的一个数组。
1. Object.values('foo')
2. // ['f', 'o', 'o']
上面代码中,字符串会先转成一个类似数组的对象。字符串的每个字符,就是该对象的一个属性。因
此, Object.values 返回每个属性的键值,就是各个字符组成的一个数组。
如果参数不是对象, Object.values 会先将其转为对象。由于数值和布尔值的包装对象,都不会为
实例添加非继承的属性。所以, Object.values 会返回空数组。
1. Object.values(42) // [] 2. Object.values(true) // []
Object.entries()
Object.entries() 方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历
(enumerable)属性的键值对数组。
1. const obj = { foo: 'bar', baz: 42 };
2. Object.entries(obj)
3. // [ ["foo", "bar"], ["baz", 42] ]
除了返回值不一样,该方法的行为与 Object.values 基本一致。
Object.entries 的基本用途是遍历对象的属性。
1. let obj = { one: 1, two: 2 };
2. for (let [k, v] of Object.entries(obj)) {
3. console.log(
4. `${JSON.stringify(k)}: ${JSON.stringify(v)}`
5. );
6. }
7. // "one": 1
8. // "two": 2
Object.entries 方法的另一个用处是,将对象转为真正的 Map 结构。
1. const obj = { foo: 'bar', baz: 42 };
2. const map = new Map(Object.entries(obj));
3. map // Map { foo: "bar", baz: 42 }
自己实现 Object.entries 方法,非常简单。
1. // Generator函数的版本 2. function* entries(obj) { 3. for (let key of Object.keys(obj)) { 4. yield [key, obj[key]]; 5. } 6. } 7. 8. // 非Generator函数的版本 9. function entries(obj) { 10. let arr = []; 11. for (let key of Object.keys(obj)) { 12. arr.push([key, obj[key]]); 13. } 14. return arr; 15. }
Object.fromEntries()
Object.fromEntries() 方法是 Object.entries() 的逆操作,用于将一个键值对数组转为对象。
1. Object.fromEntries([ 2. ['foo', 'bar'], 3. ['baz', 42] 4. ]) 5. // { foo: "bar", baz: 42 }
该方法的主要目的,是将键值对的数据结构还原为对象,因此特别适合将 Map 结构转为对象。
1. // 例一 2. const entries = new Map([ 3. ['foo', 'bar'], 4. ['baz', 42] 5. ]); 6. 7. Object.fromEntries(entries) 8. // { foo: "bar", baz: 42 } 9. 10. // 例二 11. const map = new Map().set('foo', true).set('bar', false); 12. Object.fromEntries(map) 13. // { foo: true, bar: false }
该方法的一个用处是配合 URLSearchParams 对象,将查询字符串转为对象。
1. Object.fromEntries(new URLSearchParams('foo=bar&baz=qux')) 2. // { foo: "bar", baz: "qux" }
2021-04-28 11:20:55

浙公网安备 33010602011771号