在es5中:
var arr=[];
for(var i in object){
arr.push(object[i]);
}
console.log(arr);
在es6中:
在es5中引入了Object.keys方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历属性的键名;
- var obj = { foo: 'bar', baz: 42 };
- Object.keys(obj)
- // ["foo", "baz"]
ES2017 引入了跟 Object.keys 配套的 Object.values 和 Object.entries,作为遍历一个对象的补充手段,供 for...of 循环使用。
- let {keys, values, entries} = Object;
- let obj = { a: 1, b: 2, c: 3 };
- for (let key of keys(obj)) {
- console.log(key); // 'a', 'b', 'c'
- }
- for (let value of values(obj)) {
- console.log(value); // 1, 2, 3
- }
- for (let [key, value] of entries(obj)) {
- console.log([key, value]); // ['a', 1], ['b', 2], ['c', 3]
- }
Object.values()O方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值。
- const obj = { foo: 'bar', baz: 42 };
- Object.values(obj)
- // ["bar", 42]
- const obj = { 100: 'a', 2: 'b', 7: 'c' };
- Object.values(obj)
- // ["b", "c", "a"]
上面代码中,属性名为数值的属性,是按照数值大小,从小到大遍历的,因此返回的顺序是 b、c、a。
Object.values 只返回对象自身的可遍历属性。
- const obj = Object.create({}, {p: {value: 42}});
- Object.values(obj) // []
- const obj = Object.create({}, {p:
- {
- value: 42,
- enumerable: true
- }
- });
- Object.values(obj) // [42]
- Object.values({ [Symbol()]: 123, foo: 'abc' });
- // ['abc']
- Object.values('foo')
- // ['f', 'o', 'o']
如果参数不是对象,Object.values 会先将其转为对象。由于数值和布尔值的包装对象,都不会为实例添加非继承的属性。所以,Object.values 会返回空数组。
- Object.values(42) // []
- Object.values(true) // []
Object.entries 返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。
- const obj = { foo: 'bar', baz: 42 };
- Object.entries(obj)
- // [ ["foo", "bar"], ["baz", 42] ]
如果原对象的属性名是一个 Symbol 值,该属性会被忽略。
- Object.entries({ [Symbol()]: 123, foo: 'abc' });
- // [ [ 'foo', 'abc' ] ]
Object.entries 的基本用途是遍历对象的属性。
- let obj = { one: 1, two: 2 };
- for (let [k, v] of Object.entries(obj)) {
- console.log(
- `${JSON.stringify(k)}: ${JSON.stringify(v)}`
- );
- }
- // "one": 1
- // "two": 2
- const obj = { foo: 'bar', baz: 42 };
- const map = new Map(Object.entries(obj));
- map // Map { foo: "bar", baz: 42 }