Object.entries()
和 Object.values()
本章描述了由 Jordan Harband 提出的 ECMAScript 2017 特性“Object.values/Object.entries”。
Object.entries()
let
obj
=
{
one
:
1
,
two
:
2
};
for
(
let
[
k
,
v
]
of
Object
.
entries
(
obj
))
{
console
.
log
(
`
${
JSON
.
stringify
(
k
)
}
:
${
JSON
.
stringify
(
v
)
}
`
);
}
// Output:
// "one": 1
// "two": 2
Object.values()
> Object.values({ one: 1, two: 2 })
[ 1, 2 ]
Object.entries()
此方法具有以下签名:
Object
.
entries
(
value
:
any
)
:
Array
<
[
string
,
any
]
>
如果 JavaScript 数据结构具有键和值,则*条目*是一个键值对,编码为一个 2 元素数组。 Object.entries(x)
将 x
强制转换为对象,并返回其可枚举的自有字符串键属性的条目,以数组形式返回。
> Object.entries({ one: 1, two: 2 })
[ [ 'one', 1 ], [ 'two', 2 ] ]
键为符号的属性将被忽略。
>
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
)
}
`
);
}
// Output:
// "one": 1
// "two": 2
Object.entries()
设置 Map Object.entries()
还允许您通过对象设置 Map。这比使用 2 元素数组的数组更简洁,但键只能是字符串。
let
map
=
new
Map
(
Object
.
entries
({
one
:
1
,
two
:
2
,
}));
console
.
log
(
JSON
.
stringify
([...
map
]));
// [["one",1],["two",2]]
Object.entries()
Object.entries()
的返回值是数组而不是迭代器?Object.keys()
,而不是例如 Map.prototype.entries()
。Object.entries()
只返回可枚举的自有字符串键属性?Object.keys()
保持一致。该方法也会忽略键为符号的属性。最终,可能会有一个方法 Reflect.ownEntries()
返回所有自有属性。Object.values()
Object.values()
具有以下签名:
Object
.
values
(
value
:
any
)
:
Array
<
any
>
它的工作方式与 Object.entries()
非常相似,但顾名思义,它只返回自有可枚举字符串键属性的值。
> Object.values({ one: 1, two: 2 })
[ 1, 2 ]